【问题标题】:How to connect a input stream to a output stream in Java?如何在 Java 中将输入流连接到输出流?
【发布时间】:2016-03-08 13:54:25
【问题描述】:

有一个 InputStream 和一个 OutputStream。
我想连接它们。

我想做的是从 InputStream 中读取数据。
然后使用 OutputStream 输出相同的数据。
这是我的代码。

byte[] b = new byte[8192];
while((len = in.read(b, 0, 8192)) > 0){
    out.write(b, 0, len);
}

有什么方法可以连接它们吗?
或者有没有什么方法可以在没有缓冲的情况下输入输出数据?

【问题讨论】:

  • 你为什么要这样做,是相关的问题吗?有PipedInput/OutputStream,但这是针对需要线程间通信的相当高级的用例。如果您只是在同一个线程上转储数据,那么您的方法很好。问题是 - OutputStream going... 在哪里
  • @BoristheSpider 使用管道流将从输出复制到输入。

标签: java io inputstream outputstream


【解决方案1】:

Guava 和 Apache Commons 都有复制方法:

ByteStreams.copy(input, output);

IOUtils.copy(input ,output);

它们不会直接“连接”它们。要实现我假设您想要的,请创建一个 InputStream 装饰器类,该类将读取的所有内容写入 OutputStream

【讨论】:

  • 谢谢,IOUtils.copy(input ,output); 是我想要的。
【解决方案2】:

输入和输出流都是被动对象,因此如果不创建线程将数据从一个复制到另一个,就无法连接它们。

注意:NIO 有一个transferTo 方法,尽管它的作用大致相同,只是效率更高。

您不必使用缓冲区,但如果没有缓冲区,它可能会非常慢。

【讨论】:

    【解决方案3】:

    您可以使用 NIO 通道/缓冲区

    try (FileChannel in = new FileInputStream(inFile).getChannel();
         FileChannel out = new FileOutputStream(outFile).getChannel()) 
    {
        ByteBuffer buff = ByteBuffer.allocate(8192);
    
        int len;
        while ((len = in.read(buff)) > 0) { 
            buff.flip();
            out.write(buff);
            buff.clear();
        }
    } 
    

    【讨论】:

    • 但是这种方式也需要缓冲。
    • 如果您仍然使用 NIO,为什么不直接使用FileChannel.transferTo/From?它会更有效率,特别是如果它可以要求文件系统进行传输。
    猜你喜欢
    • 2010-12-07
    • 2012-09-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-06-09
    • 1970-01-01
    • 1970-01-01
    • 2013-12-17
    相关资源
    最近更新 更多