FileOutputStream указатель головы - PullRequest
3 голосов
/ 28 апреля 2011

Я ищу подтверждение того, что FileOutputStream работает так, как я думаю. Я загружаю файл и, в случае потери сетевого подключения, пытаюсь возобновить загрузку с того места, где он был прерван.

Как я пытаюсь сделать это, чтобы открыть FileOutputStream как не добавляющийся и ничего не записывающий со смещением. У меня вопрос, будет ли это работать или удаление его без добавления удаляет содержимое? Кроме того, если я записываю со смещением, будет ли он продолжать запись после этой позиции в файле при последующих вызовах записи?

File outFile = new File(outFileName);
FileOutputStream out = new FileOutputStream(outFile);
HttpURLConnection connection = (HttpURLConnection) new URL(url).openConnection();

long fileSize = connection.getContentLength();
int status = DOWNLOADING;

connection.connect();
InputStream in = connection.getInputStream();
long downloaded = in.skip(outFile.length());

publishProgress(downloaded, fileSize);

try
{
        int read = 0;
        byte buffer[] = new byte[MAX_BUFFER_SIZE];

        // Skip ahead in the out buffer
        out.write(buffer, (int)downloaded, read);

        while(status == DOWNLOADING)
        {
                if(!NetworkUtils.isConnected(_context))
                {
                        // This breaks us out of the doInBackground in the AsyncTask
                        _downloadFailed = true;
                        throw new Exception("Network Connectivity Lost!");
                }

                read = in.read(buffer);

                if(read == -1) 
                {
                        publishProgress(fileSize);
                        break;
                }

                out.write(buffer, 0, read);
                downloaded += read;

                publishProgress(downloaded);
        }
}
finally
{
        out.close();        
        in.close();
        connection.disconnect();
}

Ответы [ 2 ]

4 голосов
/ 29 апреля 2011

Вам также следует взглянуть на класс RandomAccessFile, который позволит вам искать определенную позицию и начать писать оттуда, не обрезая файл.

2 голосов
/ 28 апреля 2011

Вы должны прочитать api doc более внимательно.

Открытие FileOutputStream в non-append more всегда стирает содержимое файла и записывает в начале.Более того, аргумент смещения метода write является смещением от начала данных (аргумента массива байтов), а не от начала файла.

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

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