是否有“管道”的输入到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();
}
}
[编辑]请注意, Reader
和Writer
中给出 。 正确答案将演示如何采取in
与out
并形成管(优选具有不超过1或2的方法调用)。 我将接受的答案,其中in
与out
是一个InputStream
和OutputStream
(优选具有从/到一个转换Reader
/ Writer
)。 我不会接受的答案,其中无论是in
或out
是的子类 Reader
/ InputStream
或Writer
/ OutputStrem
。
IOUtils从Apache Commons项目有许多utilily方法是做你需要什么。
IOUtils.copy(in, out)
将执行所有输入的缓冲拷贝到输出端。 如果在你的代码库超过一个点,需要Stream
或Reader
/ Writer
操作,使用IOUtils可能是一个好主意。
看看java.io.PipedInputStream中和的PipedOutputStream ,或PipedReader / PipedWriter来自同一个包。
从PipedInputStream的的文档:
传送输入流应该连接到管道输出流; 传送输入流然后提供所有数据字节被写入到传送输出流。 典型地,数据被从一个对象的PipedInputStream由一个线程读取,并且数据被从其他线程写入相应的PipedOutputStream。 不推荐尝试从单个线程使用这两个对象,因为它可能会死锁的线程。 传送输入流中包含的缓冲器,从去耦写操作的读操作,限制内。 的管被说成被打破,如果这是提供的数据字节到连接的管道输出流中的线程不再存活。
唯一可用的优化是通过NIO API中FileChannels: 读 , 写 。 在JVM可以优化该呼叫移动从文件到目的地频道的数据,而不必首先将数据移动到内核空间。 请参见本文的详细信息。