[Ruby]基本输入和输出

1. 文件打开和关闭

Ruby定义了一个IO基类来处理输入和输出。类File和BasicSocket都是该基类的子类。IO对象是Ruby程序和某些外部资源之间的一个双向通道。

可以使用File.new创建一个新的文件对象,例如:

file = File.new('testfile', 'r')
file.close

根据打开模式,可以创建一个用来读、写或兼有的文件对象("r"表示读取,"w"表示写,"r+"表示读写)。当创建一个文件时,还可以指定文件的许可权限。操作完成后需要关闭该文件,以确保所有缓存的数据被写入文件,并释放所有相关资源。

方法File.open也可以打开文件,通常情况下它和File.new相似,当和block一起调用时就有区别。与返回一个新的File对象不同,open会以刚打开的文件作为参数调用相关联的block,当block退出时,文件会被自动关闭,例如:

File.open('testfile', 'r') do |file|
end


2. 读文件

files.gets从文件对象file中读取一行,例如:

File.open('testfile') do |file|
  while line = file.gets
    puts line
  end
end

IO#each_byte将以从IO对象中获得的下一个8位字节为参数,调用相关联的block,例如:

File.open('testfile') do |file|
  file.each_byte {|ch| putc ch; print "."}
end

IO#each_line以文件的每一行为参数调用相关联的block,例如:

File.open('testfile') do |file|
  file.each_line {|line| puts "Got #{line.dump}"}
end

IO.foreach方法以I/O数据源的名字作为参数,以读模式打开它,并以文件中的每一行为参数调用关联的迭代器,最自动关闭该文件,例如:

IO.foreach('testfile') {|line| puts line}


3. 写文件

如果想写入二进制数据而不想被Ruby干扰,可以调用IO#print,并以包括待写入字节的字符串作为参数,也可以使用底层的输入输出例程,如IO#sysread和IO#syswrite。

常用的将二进制数据存储到字符串中的方法有3个:字符串的字面量,逐字节地存入,或使用Array#pack,例如:

str1 = "\001\002\003"
str2 = ""
str2 << 1 << 2 << 3
[1, 2, 3].pack("c*")

StringIO对象的行为很像其他I/O对象,不同的是它们读写的是字符串而不是文件。如果为读而打开一个StringIO对象,需要提供一个字符串给它,在此对象上进行的所有读操作都会从该字符串中读。同时,向StringIO对象写入时,要传递一个待填充的字符串,例如:

require 'stringio'
ip = StringIO.new("now is\nthe time\nto learn\nRuby!")
op = StringIO.new('', 'w')
ip.each_line do |line|
  op.puts line.reverse
end


4. 网络

Ruby的套节字库提供了一组类用于处理网络层。这些类可以访问TCP、UDP、SOCK、Unix域套节字,以及任意其他支持的套节字类型。库中还提供了辅助类,使得写服务器程序更容易,例如:

require 'socket'
client = TCPSocket.open('127.0.0.1', 'finger')
client.send("mysql\n", 0)
puts client.readlines
client.close

在较高层次上,lib/net库提供了一组模块来处理应用层协议(目前支持FTP,HTTP,POP,SMTP和telnet),例如:

require 'net/http'
h = Net::HTTP.new('www.test.com', 80)
response = h.get('/index.html', nil)
if response.message == 'OK'
  puts response.body.scan(/<img src="(.*?)"/m).uniq
end

还可以在更高层进行处理,通过装载open-uri库,方法Kernel.open立刻就可以识别文件名中的http://和ftp://等URL,还能自动处理重定向,例如:

require 'open-uri'
open('http://www.test.com') do |f|
  puts f.read.scan(/<img src="(.*?)"/m).uniq
end



本文出自 “青锋笔记” 博客,谢绝转载!

你可能感兴趣的:(Ruby,基本输入和输出)