我正在尝试下载/恢复文件。恢复似乎工作,但整个下载带来了问题。执行此代码后,测试文件为 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字节!我知道不应该这样,但似乎就是我说的。我该怎么想这个?感谢。
答案 0 :(得分:5)
bout.flush();
和/或
bout.close();
答案 1 :(得分:0)
您需要关闭BufferedOutputStream以确保缓冲的所有内容都被发送到缓冲的OutputStream。
答案 2 :(得分:-2)
while (in.available() > 0) { x = in.read(data, 0, 1024); bout.write(data, 0, x); }