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);