IO类
输入/输出的种类
标准输入
获取键盘输入的内容
- 通过预定义常量STDIN可以调用操作标准输入的IO对象。
- 全局变量$stdin也可以引用标准输入的IO对象。
- 不指定接受者的gets方法从标准输入中获取数据。
标准输出
向标准输入写入的数据会显示在屏幕中
- 通过预定义常量STDOUT可以调用操作标准输出的IO对象。
- $stdout
- puts、print、printf会将数据写入到标准输出。
标准错误输出
向标准错误输出写入的数据会系那是在屏幕中
- STDERR
- $stderr
#标准输出
$stdout.print "Output to $stdout.\n"
#标准错误输出
$stderr.print "Output to $stderr.\n"
#ruby out.rb
#=> "Output to $stdout."
#=> "Output to $stderr.
# >是重定向,重定向后,标准输出的内容会存入log.txt
#ruby out.rb > log.txt
"Output to $stderr.
文件输入/输出
io=File.open(file, mode)
io=open(file, mode)
缺省模式为r,模式后加上b表示二进制模式
模式 | 意义 |
---|---|
r | 用只读模式打开文件。 |
r+ | 用读写模式打开文件。 |
w | 用只写模式打开。文件不存在则创建新文件;存在则清空,即将文件大小设为0。 |
w+ | 读写模式,其他同"w" |
a | 用追加模式打开文件,文件不存在,创建新文件。 |
a+ | 用读取/追加模式打开文件。文件不存在则创建新的文件。 |
io.close
使用close方法关闭已打开的文件。其实用块,会自动关闭的。
File.open("foo.txt") do |io|
...
end
io.close?
检查IO对象是否关闭
io = File.open("foo.txt")
io.close
p io.close?
#=> true
File.read(file)
一次性读取文件file的内容。注意:windows中不能读取图像等二进制数据,因为它使用文本模式打开文件,会对换行符等进行转换。
data = File.read("foo.txt")
基本输入/输出操作
io.gets(rs)
io.each(rs)
io.each_line(rs)
io.readlines(rs)
从IO类的对象io中读取一行数据,用参数rs的字符串分行,默认使用预定义变量 $/
(值为\n
)
while line = io.gets
line.chomp!
...
end
#判断是否到结束
p io.eof?
#=> true
io.each_line do |line|
line.chomp!
...
end
#readlines返回数组
ary = io.readlines
ary.each do |line|
line.chomp!
...
end
io.lineno
io.lineno=(number)
获取gets、each_line的当前读取的行数。io.lineno=(number),设置行号,屁用没有~
io.each_line do |line|
p io.lineno
end
io.each_char
逐个字符读取io中的数据,并执行块
io.each_char do |char|
p char
end
io.each_byte
逐个字节读取,并启动块。得到的是ASCII码的整数形式
io.getc
只读取io中的一个字符。
io.ungetc(ch)
将参数ch指定的字符退回到io的输入缓冲中。
io.getbyte
只读取io中的一个字节,返回ASCII码的整数形式
io.ungetbyte(byte)
将参数byte指定的一个字节退回到输入缓冲中。
io.read(size)
读取参数size指定大小的数据。不指定大小时,一次性读取全部数据并返回。
# "hello.txt"中的内容为 "Hello, Ruby.\n"
File.open("hello.txt") do |io|
p io.read(5)
#=> "Hello"
p io.read
#=> ", Ruby.\n"
end
输出操作
io.puts(str0, str1, ...)
对字符串末尾添加换行符后输出。如果参数为String类意外的对象,则自动会调用to_s方法。
$stdout.puts "foo", "bar", "baz"
io.putc(ch)
输出参数ch指定的字符编码对应的字符。 没啥用。
io.print(str0, str1, ...)
输出参数指定的字符串
io.printf(fmt, arg0, arg1, ...)
按指定格式输出字符串
io.write(str)
输出参数str指定的字符串。返回值为字节数
size = $stdout.wirte("Hello.\n")
#=> Hello.
p size
#=> 6
io<<str
输出参数str指定字符串。<<会返回接受者本身
io << "foo" << "bar" << "baz"
文件指针
io.pos
io.pos=(position)
# "hello.txt"中的内容为 "Hello, Ruby.\n"
File.open("hello.txt") do |io|
p io.read(5)
#=> "Hello"
p io.pos
#=> 5
io.pos = 0
p io.gets
#=> "Hello, Ruby.\n"
end
io.seek(offset, whence)
移动文件指针方法。offset为指定位置的整数。whence指定如何移动
whence | 意义 |
---|---|
IO::SEEK_SET | 将文件指针移动到offset指定位置 |
IO::SEEK_CUR | 将offset视为相对于当前位置偏移 |
IO::SEEK_END | 将offset视为相对于文件末尾的偏移 |
io.rewind
将文件指针返回到文件的开头
# "hello.txt"中的内容为 "Hello, Ruby.\n"
File.open("hello.txt") do |io|
p io.gets
#=> "Hello, Ruby.\n"
io.rewind
p io.gets
#=> "Hello, Ruby.\n"
end
io.truncate(size)
按size大小截取文件
io.truncate(0) #将文件大小置为0
io.truncate(io.pos) #删除当前文件指针后的数据
二进制模式与文本模式
因为各个平台换行符不一样,为了保证程序的兼容性,ruby会自动转换。
io = File.open("text.txt", "w+")
#写入windows,自动变成\r\n
io.print("Hello, world.\n")
io.rewind
#读取,又变成\n了
p io.gets
#=> "Hello, world.\n."
File.open("foo.txt", "w") do |io|
#将默认的文本模式,转为二进制模式。
io.binmode
io.write "Hello, world.\n"
end
open-uri库
这是很常用的方法了,读取网络文件
require "open-uri"
open("http://www.hao123.com") do |io|
puts io.read
end