我正在尝试下载/恢复文件。简历似乎有效,但整个下载带来了问题。执行此代码后,测试文件为5242845。但它应该是5242880!我在十六进制编辑器中打开了这两个文件,发现测试文件末尾缺少一些字节(可以开始)。这是代码:
String url = "http://download.thinkbroadband.com/5MB.zip";
String DESTINATION_PATH = "/sdcard/testfile";
URLConnection connection;
connection = (HttpURLConnection) url.openConnection();
File file = new File(DESTINATION_PATH);
if (file.exists()) {
downloaded = (int) file.length();
connection.setRequestProperty("Range", "bytes=" + (file.length()) + "-");
}
connection.setDoInput(true);
connection.setDoOutput(true);
BufferedInputStream in = new BufferedInputStream(connection.getInputStream());
FileOutputStream fos = (downloaded == 0) ? new FileOutputStream(DESTINATION_PATH) : new FileOutputStream(DESTINATION_PATH, true);
BufferedOutputStream bout = new BufferedOutputStream(fos, 1024);
byte[] data = new byte[1024];
int x = 0;
int i = 0;
int lenghtOfFile = connection.getContentLength();
while ((x = in.read(data, 0, 1024)) != -1) {
i++;
bout.write(data, 0, x);
downloaded += x;
}
我认为问题出在这里while ((x = in.read(data, 0, 1024)) != -1) {
。
例如,我们有一个1030字节长的文件。第一次写入是好的,bout.write(data,0,1024);
,但下次while ((x = in.read(data, 0, 1024)) != -1) {
得到-1,因为还剩下1030-1024=6个字节。我们正在尝试写入1024字节!我知道不应该这样,但我似乎就是这么说的。我该怎么想?谢谢
bout.flush();
和/或
bout.close();
您需要关闭BufferedOutputStream,以确保所有缓冲的内容都发送到缓冲的OutputStream。
google告诉我,有一种"可用"的bufferedinputstream方法,所以你可以写(我不是java大师)
while(in.available()>0){x=in.read(数据,1024);关于写入(数据,0,x);}