【发布时间】:2017-10-26 13:49:09
【问题描述】:
我希望能够通过网络读取多个数据流并将文件写入网络并结合所有这些多个文件。
由于文件可能非常大,我不想做任何本地 IO 文件操作,而是对数据流进行操作。 从网络读取流,以 zip 格式将流写入网络。
我正在尝试下面的示例代码,但我没有看到远程主机上正在写入任何文件。
如果我使用FileInputStream,而不是通过网络写入,那么写入本地磁盘文件就可以了。
我想写什么给网络?
InputStream input = new URL("http://www.cacr.caltech.edu/projects/danse/talks/kickoff/07-Butler/SANS_DANSEkickoffAug06.pdf").openStream();
URL url = new URL("http://posttestserver.com/post.php?dir=ziptest");
HttpURLConnection connection = (HttpURLConnection) url.openConnection();
connection.setRequestMethod("POST");
connection.setDoOutput(true);
connection.setDoInput(true);
ZipOutputStream zipOutputStream = new ZipOutputStream(connection.getOutputStream());
zipOutputStream.putNextEntry(new ZipEntry("1.pdf"));
byte[] buffer = new byte[0xFFFF];
for (int len; (len = input.read(buffer)) != -1;) {
zipOutputStream.write(buffer, 0, len);
}
zipOutputStream.putNextEntry(new ZipEntry("2.pdf"));
InputStream input1 = new URL("http://www.pdf995.com/samples/pdf.pdf").openStream();
for (int len; (len = input1.read(buffer)) != -1;) {
zipOutputStream.write(buffer, 0, len);
}
zipOutputStream.close();
int responseCode = connection.getResponseCode();
System.out.println("HTTP response code="+responseCode);
connection.disconnect();
【问题讨论】:
-
你没有打电话给
ZipOutputStream.closeEntry()。在循环之后冲洗,而不是在它们内部。我可以在posttestserver.com/data/2017/10/26/ziptest 看到三个文件,但它们看起来有点短。 -
@EJP 如果需要,
putNextEntry()和close()都会自动调用closeEntry()。 --- 永远不需要flush()。 -
@Andreas 同意,当然不在循环内。
-
@EJP :我删除了
flush(),但结果与没有生成文件相同。 -
@NoviceUser 我没有说它会解决任何问题。冲洗内部循环只是不好的做法。你检查过我给你的链接中的任何文件吗?
标签: java performance networking optimization zip