如果我有一个将要写入的IO对象,以及一个从中读取的IO对象,我怎样才能轻松地将一个IO管道传输到另一个?
我的用例大致是:
require "open3"
# File < IO
files = [File.open('1.sql'), File.open('2.sql')]
input, waiters = Open3.pipeline_w("mysql") # input is an IO
files.each do |file|
file.each_line do |line|
input.write line
end
end
input.close
Process.wait waiters[0].pid
另一种方法是使用Open3.pipeline('cat myfile.sql', 'mysql')
,但是对于所有文件,我只能启动mysql
一次。
答案 0 :(得分:1)
您可以使用IO.copy_stream:
files = [File.open('1.sql'), File.open('2.sql')]
mysql = IO.popen('mysql','w') # Spawn a `mysql` process for writing to its `STDIN`, returns an `IO`
files.each do |file|
IO.copy_stream(file, mysql) # Takes two `IO` objects, reads from first and writes to second
file.close()
end
mysql.close()
如果您的方法/程序现已结束,请随意省略close()
调用,因为文件句柄将自动关闭。
请注意,一次打开无限数量的文件可能会很危险(每个进程都有打开文件的限制),因此请考虑逐个打开和关闭它们。