FileOutputStream头指针

时间:2011-04-28 16:16:01

标签: java android file-io

我正在寻找一些确认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 个答案:

答案 0 :(得分:4)

您还应该查看RandomAccessFile类,它可以让您寻找某个位置并从那里开始编写,而不会截断文件。

答案 1 :(得分:2)

您应该仔细阅读api doc

在非附加文件中打开FileOutputStream会一直擦除文件的内容并在开头写入。此外,write方法的offset参数是从数据开头(字节数组参数)的偏移量,而不是从文件的开头。

您应该只在附加模式下打开流,并在读取n个字节的数据时开始写入,n是文件中已存在的字节数。