首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Java -通过带有缓冲区的网络下载文件

Java -通过带有缓冲区的网络下载文件
EN

Stack Overflow用户
提问于 2014-12-30 14:30:01
回答 2查看 1.2K关注 0票数 3

我想从网络流中读取,并将字节直接写入文件。但是每次我运行这个程序时,实际上很少有字节被写入文件中。

爪哇:

代码语言:javascript
复制
InputStream in = uc.getInputStream();
int clength=uc.getContentLength();
byte[] barr = new byte[clength];
int offset=0;
int totalwritten=0;
int i;
int wrote=0;

OutputStream out = new FileOutputStream("file.xlsx");
while(in.available()!=0) { 
   wrote=in.read(barr, offset, clength-offset);
   out.write(barr, offset, wrote);
   offset+=wrote;
   totalwritten+=wrote;
}
System.out.println("Written: "+totalwritten+" of "+clength);
out.flush();
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-12-30 14:42:36

那是因为可得()没有做你想做的事情。阅读它的API文档。您应该直接读取,直到读取的字节数(由read()返回)为-1。或者更简单,使用Files.copy()

代码语言:javascript
复制
Files.copy(in, new File("file.xlsx").toPath());

使用具有输入流大小的缓冲区也大大超出了使用缓冲区的目的,缓冲区的目的是内存中只有几个字节。

如果要重新实现copy(),一般模式如下:

代码语言:javascript
复制
byte[] buffer = new byte[4096]; // number of bytes in memory
int numberOfBytesRead;
while ((numberOfBytesRead = in.read(buffer)) >= 0) {
    out.write(buffer, 0, numberOfBytesRead);
}
票数 4
EN

Stack Overflow用户

发布于 2014-12-30 14:40:16

使用.available()是错误的。来自Java文档

available()返回可以从此输入流中读取(或跳过)的字节数的估计值,而无需在下次调用该输入流的方法时阻塞这些字节数。

这意味着当您的流第一次比您的文件写入速度慢(很可能很快)时,时间结束。

您应该准备一个线程,等待输入,直到它读取了所有预期的内容长度(当然有相当大的超时时间),或者在等待中阻塞您的程序,如果用户交互不是什么大不了的事情。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/27707222

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档