0

私の Java コードは 25 MB のファイルを転送しません。16 MB で停止します。私は何も変えようとしtransferFrom 1 << 24まし48 & 31 & 8たが、それを悪化させただけでした。何か案が?

ReadableByteChannel rbc = Channels.newChannel(fileURL.openStream());
FileOutputStream fos = new FileOutputStream(path + fileName);
fos.getChannel().transferFrom(rbc, 0, 1 << 24);
fos.close();
4

2 に答える 2

2

使用する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 などのオープン ソース ユーティリティを使用できます ( FileUtilsCommons 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 つのチャンクで転送されるという保証がないため、限られた量のデータのみをダウンロードします。

于 2013-01-19T22:51:36.927 に答える
0

transferFrom は、特に URL では、1 回の呼び出しで完了するとは限りません。ループで呼び出す必要があります。

于 2013-01-19T17:44:49.423 に答える