用于“管道”的Java习语

时间:2008-09-24 15:11:17

标签: java io pipe

是否有更简洁/标准的习惯用法(例如,JDK方法)用于“管道”输入到Java中的输出而不是以下内容?

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个方法调用)。我会接受inoutInputStreamOutputStream的答案(最好是从{到Reader / Writer转换) 。我不接受inoutReader / InputStreamWriter / {{1}的子类的答案}}

3 个答案:

答案 0 :(得分:10)

来自Apache Commons项目的

IOUtils有一些utilily methods可以完全满足您的需求。

IOUtils.copy(in, out)将执行输出的所有输入的缓冲副本。如果您的代码库中有多个需要StreamReader / Writer处理的位置,那么使用IOUtils可能是一个好主意。

答案 1 :(得分:1)

从同一个软件包中查看java.io.PipedInputStreamPipedOutputStreamPipedReader / PipedWriter

来自PipedInputStream的文档:

管道输入流应连接到管道输出流;然后,管道输入流提供写入管道输出流的任何数据字节。通常,一个线程从PipedInputStream对象读取数据,并且某些其他线程将数据写入相应的PipedOutputStream。建议不要尝试使用单个线程中的两个对象,因为它可能使线程死锁。管道输入流包含缓冲区,在一定限度内将读操作与写操作分离。如果为连接的管道输出流提供数据字节的线程不再存在,则称管道被破坏。

答案 2 :(得分:1)

唯一可用的优化是通过NIO API中的FileChannels:ReadsWrites。 JVM可以优化此调用以将数据从文件移动到目标通道,而无需先将数据移动到内核空间。有关详细信息,请参阅this article