файл никогда не загружается полностью - PullRequest
4 голосов
/ 22 июня 2011

Я пытаюсь загрузить / возобновить файл.Резюме, кажется, работает, но вся загрузка приносит проблему.После выполнения этого кода тестовый файл имеет вид 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 байта!Я знаю, что так не должно быть, но, похоже, я так и сказал.Как я могу понять это?Спасибо.

Ответы [ 3 ]

5 голосов
/ 22 июня 2011
bout.flush();

и / или

bout.close();
0 голосов
/ 22 июня 2011

Google сказал мне, что есть "доступный" метод bufferedinputstream, поэтому вы можете писать как (я не гава Java)

while (in.available() > 0) 
{
    x = in.read(data, 0, 1024);
    bout.write(data, 0, x);
}
0 голосов
/ 22 июня 2011

Вам необходимо закрыть свой BufferedOutputStream, чтобы гарантировать, что все, что буферизовано, отправлено в буферизованный OutputStream.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...