是否有更简洁/标准的习惯用法(例如,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(); } }
[编辑]请注意Reader
和Writer
给出。正确的答案将演示如何使用in
和out
并形成一个管道(最好不超过1或2个方法调用)。我会接受in
和out
为InputStream
和OutputStream
的答案(最好是从{到Reader
/ Writer
转换) 。我不接受in
或out
是Reader
/ InputStream
或Writer
/ {{1}的子类的答案}}
答案 0 :(得分:10)
IOUtils有一些utilily methods可以完全满足您的需求。
IOUtils.copy(in, out)
将执行输出的所有输入的缓冲副本。如果您的代码库中有多个需要Stream
或Reader
/ Writer
处理的位置,那么使用IOUtils可能是一个好主意。
答案 1 :(得分:1)
从同一个软件包中查看java.io.PipedInputStream和PipedOutputStream或PipedReader / PipedWriter。
来自PipedInputStream的文档:
管道输入流应连接到管道输出流;然后,管道输入流提供写入管道输出流的任何数据字节。通常,一个线程从PipedInputStream对象读取数据,并且某些其他线程将数据写入相应的PipedOutputStream。建议不要尝试使用单个线程中的两个对象,因为它可能使线程死锁。管道输入流包含缓冲区,在一定限度内将读操作与写操作分离。如果为连接的管道输出流提供数据字节的线程不再存在,则称管道被破坏。
答案 2 :(得分:1)
唯一可用的优化是通过NIO API中的FileChannels:Reads,Writes。 JVM可以优化此调用以将数据从文件移动到目标通道,而无需先将数据移动到内核空间。有关详细信息,请参阅this article。