9

是否有比以下更简洁/标准的习语(例如,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();
    }
}

[编辑] 请注意Readerand Writerare given。正确答案将演示如何采用inout形成管道(最好不超过 1 或 2 个方法调用)。我会接受答案 where inand outare an InputStreamand an OutputStream(最好是从/到Reader/的转换Writer)。in如果orout是/或/的子类,我将不接受答案。ReaderInputStreamWriterOutputStrem

4

3 回答 3

10

来自 Apache Commons 项目的 IOUtils 有许多实用的方法可以完全满足您的需求。

IOUtils.copy(in, out)将对所有输入执行缓冲复制到输出。如果您的代码库中有多个地方需要StreamReader/Writer处理,则使用 IOUtils 可能是一个好主意。

于 2008-12-01T19:10:48.607 回答
1

查看同一包中的java.io.PipedInputStreamPipedOutputStreamPipedReader / PipedWriter

从 PipedInputStream 的文档中:

管道输入流应该连接到管道输出流;然后,管道输入流提供写入管道输出流的任何数据字节。通常,数据由一个线程从 PipedInputStream 对象读取,数据由其他线程写入相应的 PipedOutputStream。不建议尝试从单个线程中使用这两个对象,因为它可能会使线程死锁。管道输入流包含一个缓冲区,在限制范围内将读取操作与写入操作分离。如果向连接的管道输出流提供数据字节的线程不再活动,则称该管道已损坏。

于 2008-09-24T15:15:27.093 回答
1

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

于 2008-09-24T19:11:17.290 回答