如何将IO对象读入另一个对象

时间:2018-02-28 12:58:11

标签: ruby

如果我有一个将要写入的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一次。

1 个答案:

答案 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()调用,因为文件句柄将自动关闭。 请注意,一次打开无限数量的文件可能会很危险(每个进程都有打开文件的限制),因此请考虑逐个打开和关闭它们。