Java transferFrom不会传输超过16mb?

时间:2013-01-19 17:21:09

标签: java file-io java-io

我的java代码不会传输我的25mb文件 - 它会停在16mb。我尝试将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();

2 个答案:

答案 0 :(得分:2)

如果您使用Java7,可以使用花哨的java.nio.file.Files utils进行复制。

 URL url = new URL("http://www.stackoverflow.com");
 try (InputStream is = url.openStream()) {
    Files.copy(is, Paths.get("/tmp/output.tmp"));
 }

如果你没有,你可以使用开源工具 - 例如来自Apache(在Commons IO中搜索FileUtils)。

如果你想坚持使用当前的解决方案,你可以这样写:

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 :(得分:0)

不保证transferFrom在一次调用中完成,尤其是使用URL。你需要循环调用它。