在Ruby语言中,利用字符串保存二进制文件已经是一个非常方便的步骤了。那么具体的操作方法优势怎样的呢?下面我们就一起来看看Ruby操作二进制文件相关技巧介绍。#t#
可是在windows下是例外,在他下面,Ruby操作二进制文件和文本文件的不同是,在二进制mode下,结束行不能被转义为一个单独的换行,而是被保存为一个回车换行对.
另外的不同是,在文本模式下 control-Z被作为文件的结束:
# Create a file (in binary mode)
File.open("myfile","wb")
{|f| f.syswrite("12345\0326789\r") }
# Above note the embedded
octal 032 (^Z)
# Read it as binary
str = nil
File.open("myfile","rb")
{|f| str = f.sysread(15) }
puts str.size# 11
# Read it as text
str = nil
File.open("myfile","r")
{|f| str = f.sysread(15) }
puts str.size# 5
- 1.
- 2.
- 3.
- 4.
- 5.
- 6.
- 7.
- 8.
- 9.
- 10.
- 11.
- 12.
- 13.
- 14.
- 15.
- 16.
这边注意,这些代码都是在windows下才会打印出后面的结果,如果是在linux两处都会打印出11.
再看下面的Ruby操作二进制文件代码:
# Input file contains a
single line: Line 1.
file = File.open("data")
line = file.readline #
"Line 1.\n"
puts "#{line.size} characters."
# 8 characters
file.close
file = File.open("data","rb")
line = file.readline # "Line 1.\r\n"
puts "#{line.size} characters."
# 9 characters
二进制模式的结尾是一个回车换行对.
file.close
- 1.
- 2.
- 3.
- 4.
- 5.
- 6.
- 7.
- 8.
- 9.
- 10.
- 11.
- 12.
- 13.
- 14.
binmode方法能够转换当前的流为二进制模式,这边要注意的是,一旦切换过去,就不能切换回来了:
file = File.open("data")
file.binmode
line = file.readline
# "Line 1.\r\n"
puts "#{line.size}
characters." # 9 characters
file.close
- 1.
- 2.
- 3.
- 4.
- 5.
- 6.
- 7.
如果你想使用更底层的输入输出,那你可以选择sysread和syswrite方法,他们接受一定数量的字节作为参数 .
input = File.new
("myfile",'a+')
output = File.new
("outfile",'a+')
instr = input.sysread(10);
puts instr
bytes = output.syswrite
("This is a test.")
- 1.
- 2.
- 3.
- 4.
- 5.
- 6.
- 7.
- 8.
如果文件指针已经到达文件的结尾时,sysread方法将会抛出一个异常.
这边要注意 Array 的pack和string的unpack方法,对于Ruby操作二进制文件非常有用.