对于“管道”是否有更简洁/标准的习惯用法(例如,JDK方法)。 Java输出到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();
    }
}

[编辑]请注意 Reader Writer 。正确的答案将演示如何在和 out 中使用并形成一个管道(最好不超过1或2个方法调用)。我将接受答案,其中 in out InputStream OutputStream (最好是从/到转换) <代码>阅读器 / <代码>作家)。我不接受 in out Reader / InputStream的子类的答案 Writer / OutputStrem

有帮助吗?

解决方案

来自Apache Commons项目的 IOUtils 有一些 utilily方法,完全符合您的需要。

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

其他提示

查看 java.io.PipedInputStream PipedOutputStream ,或 PipedReader / PipedWriter 来自同一个软件包。

来自PipedInputStream的文档:

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

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

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top