ネットワーク経由で複数のデータストリームを読み込み、これらの複数のファイルすべてを組み合わせてネットワークにファイルを書き込む機能が必要です。ZipOutputStream to network
ファイルが非常に大きくなる可能性があるので、私はローカル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()'を呼び出していません。ループの後でフラッシュしてください。私はhttp://posttestserver.com/data/2017/10/26/ziptest/で3つのファイルを見ることができますが、少し短く見えます。 – EJP
@EJP 'putNextEntry()'と 'close()'は、必要に応じて 'closeEntry()'を自動的に呼び出します。 --- 'flush()'する必要はありません。 – Andreas
@Andreas同意しました。確かに内部ループではありません。 – EJP