Java 如何将一个流读入另一个流?

Java 如何将一个流读入另一个流?,java,Java,问题:我如何才能以一种非手工制作的循环方式读取所有内容,从输入到输出,并使用自己的字节缓冲区?编写一个方法来执行此操作,并从需要此功能的任何地方调用它。在中已经有此的代码。我确信几乎任何其他具有“通用”IO功能的库也有它,但Guava是我第一个可能的“go-to”库。它摇摆:)或者可以使用番石榴(旧的),或者(评论中建议的新的)。在中,您可以使用: 但是我同意Jon Skeet的观点,我宁愿使用Guava的我宁愿使用循环,而不是导入新类,或者在我的项目中添加库。库函数可能也通过循环实现。但那只是

问题:我如何才能以一种非手工制作的循环方式读取所有内容,从
输入
输出
,并使用自己的字节缓冲区?

编写一个方法来执行此操作,并从需要此功能的任何地方调用它。在中已经有此的代码。我确信几乎任何其他具有“通用”IO功能的库也有它,但Guava是我第一个可能的“go-to”库。它摇摆:)

或者可以使用番石榴(旧的),或者(评论中建议的新的)。

在中,您可以使用:


但是我同意Jon Skeet的观点,我宁愿使用Guava的

我宁愿使用循环,而不是导入新类,或者在我的项目中添加库。库函数可能也通过循环实现。但那只是我个人的品味

然而,我的问题是:你想做什么?想想“大画面”,如果你想把一个文件的全部内容放入一个字节数组,为什么不这样做呢?arrray的大小为file.length(),您不需要它动态增长,隐藏在ByteArrayOutputStream后面(除非您的文件是共享的,并且在读取时其内容可以更改)


另一种选择:您可以使用FileChannel和ByteBuffer(java.nio)吗?

那么Guava的ByTestStreams.copy(in,out)的功能是:


在我的项目中,我使用了以下方法:

  private static final int BUF_SIZE = 0x1000; // 4K

  public static long copy(InputStream from, OutputStream to)
      throws IOException {
    checkNotNull(from);
    checkNotNull(to);
    byte[] buf = new byte[BUF_SIZE];
    long total = 0;
    while (true) {
      int r = from.read(buf);
      if (r == -1) {
        break;
      }
      to.write(buf, 0, r);
      total += r;
    }
    return total;
  }
Java 9(及更高版本)答案():


似乎他们终于意识到,这个功能是如此普遍需要,它最好是内置的。该方法返回复制的字节数,以备您需要了解。

已弃用。使用IOUtils。将在2.0中删除。重命名为IOUtils.write()或IOUtils.copy()的方法@Sean Patrick Floyd Thanx--已经更新了答案。
ByTestStreams
被注释为
@Beta
这不是问题吗?@gabuzo:这取决于你对风险的厌恶程度。我怀疑这个方法调用不太可能改变,而且我确信实现是好的。即使它改变或消失,您也只需要在升级时修复它。该方法简单,源代码可用(甚至可以作为subversion repo)。如果您解释为什么您的代码不同,以及它如何修复IssueCise代码而不使用库,可能会对其他人有所帮助。只需简短简单的代码,没有任何依赖项,纯java
InputStream in = new FileInputStream(myFile);
OutputStream out = new ByteArrayOutputStream();
IOUtils.copy(in, out);
  private static final int BUF_SIZE = 0x1000; // 4K

  public static long copy(InputStream from, OutputStream to)
      throws IOException {
    checkNotNull(from);
    checkNotNull(to);
    byte[] buf = new byte[BUF_SIZE];
    long total = 0;
    while (true) {
      int r = from.read(buf);
      if (r == -1) {
        break;
      }
      to.write(buf, 0, r);
      total += r;
    }
    return total;
  }
private static void copyData(InputStream in, OutputStream out) throws Exception {
    byte[] buffer = new byte[8 * 1024];
    int len;
    while ((len = in.read(buffer)) > 0) {
        out.write(buffer, 0, len);
    }
}
in.transferTo(out);