Java的成语“管道”(Java idiom for “piping”)

2019-09-23 16:55发布

是否有“管道”的输入到Java中的输出比下面更简明/标准成语(例如,JDK方法)?

public void pipe(Reader in, Writer out) {
    CharBuffer buf = CharBuffer.allocate(DEFAULT_BUFFER_SIZE);
    while( in.read(buf) >= 0 ) {
      out.append(buf.flip());
      buf.clear();
    }
}

[编辑]请注意, ReaderWriter给出 。 正确答案将演示如何采取inout并形成管(优选具有不超过1或2的方法调用)。 我将接受的答案,其中inout是一个InputStreamOutputStream (优选具有从/到一个转换Reader / Writer )。 我不会接受的答案,其中无论是inout是的子类 Reader / InputStreamWriter / OutputStrem

Answer 1:

IOUtils从Apache Commons项目有许多utilily方法是做你需要什么。

IOUtils.copy(in, out)将执行所有输入的缓冲拷贝到输出端。 如果在你的代码库超过一个点,需要StreamReader / Writer操作,使用IOUtils可能是一个好主意。



Answer 2:

看看java.io.PipedInputStream中和的PipedOutputStream ,或PipedReader / PipedWriter来自同一个包。

从PipedInputStream的的文档:

传送输入流应该连接到管道输出流; 传送输入流然后提供所有数据字节被写入到传送输出流。 典型地,数据被从一个对象的PipedInputStream由一个线程读取,并且数据被从其他线程写入相应的PipedOutputStream。 不推荐尝试从单个线程使用这两个对象,因为它可能会死锁的线程。 传送输入流中包含的缓冲器,从去耦写操作的读操作,限制内。 的管被说成被打破,如果这是提供的数据字节到连接的管道输出流中的线程不再存活。



Answer 3:

唯一可用的优化是通过NIO API中FileChannels: 读 , 写 。 在JVM可以优化该呼叫移动从文件到目的地频道的数据,而不必首先将数据移动到内核空间。 请参见本文的详细信息。



文章来源: Java idiom for “piping”
标签: java io pipe