[Ruby]基本入力と出力


1.ファイルの開閉
Rubyは入出力を処理するIOベースクラスを定義した.クラスFileとBasicSocketは、このベースクラスのサブクラスです.IOオブジェクトは、Rubyプログラムと一部の外部リソースとの間の双方向チャネルである.
Fileを使用できます.newは、次のような新しいファイルオブジェクトを作成します.
file = File.new('testfile', 'r')
file.close

開くモードに応じて、読み取り、書き込み、または兼用のファイルオブジェクトを作成できます(「r」は読み取り、「w」は書き込み、「r+」は読み書きを表します).ファイルを作成するときに、ファイルのライセンス権限を指定することもできます.操作が完了したら、ファイルを閉じて、すべてのキャッシュされたデータがファイルに書き込まれ、すべての関連リソースが解放されることを確認する必要があります.
方法Openはファイルを開くこともできますが、通常はFileと同じです.newは似ていて、blockと一緒に呼び出すと違いがあります.新しいFileオブジェクトを返すのとは異なり、openは開いたばかりのファイルをパラメータとして関連するblockを呼び出し、blockが終了すると自動的にファイルが閉じます.たとえば、次のようにします.
File.open('testfile', 'r') do |file|
end

2.ファイルを読む
files.getsは、ファイルオブジェクトfileから1行を読み込みます.たとえば、次のようにします.
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などの最下位の入出力ルーチンを使用してもよい.
よく使われるバイナリデータを文字列に格納する方法は、文字列の字面量、バイト単位で格納する方法、またはArray#packを使用する方法の3つです.たとえば、次のようになります.
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
the time
to learn
Ruby!") 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
", 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ライブラリをマウントすることにより、より上位層で処理を行うことも可能である.Openはすぐにファイル名のhttp://やftp://などのURLを認識し、リダイレクトを自動的に処理することができます.例えば、
require 'open-uri'
open('http://www.test.com') do |f|
  puts f.read.scan(/<img src="(.*?)"/m).uniq
end

本文は“青鋒ノート”のブログから出て、転載をお断りします!