使用するJava7
場合は、派手なjava.nio.file.Files
ユーティリティを使用してコピーできます。
URL url = new URL("http://www.stackoverflow.com");
try (InputStream is = url.openStream()) {
Files.copy(is, Paths.get("/tmp/output.tmp"));
}
そうでない場合は、Apache などのオープン ソース ユーティリティを使用できます ( FileUtils
Commons IO で検索してください)。
そして、現在のソリューションに固執したい場合は、次のように記述できます。
BufferedInputStream bis = new BufferedInputStream(url.openStream());
BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(
"/tmp/output2.tmp"));
byte[] buffer = new byte[1024 * 1024];
int read = 0;
while ((read = bis.read(buffer)) != -1) {
bos.write(buffer, 0, read);
}
bos.close();
bis.close();
意図は、ストリームの最後に到達するまで読む必要があるということです。そのため、transferFrom
すべてのデータが 1 つのチャンクで転送されるという保証がないため、限られた量のデータのみをダウンロードします。