我的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();
答案 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。你需要循环调用它。