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