我正在寻找一些确认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();
}
答案 0 :(得分:4)
您还应该查看RandomAccessFile
类,它可以让您寻找某个位置并从那里开始编写,而不会截断文件。
答案 1 :(得分:2)
您应该仔细阅读api doc。
在非附加文件中打开FileOutputStream会一直擦除文件的内容并在开头写入。此外,write方法的offset参数是从数据开头(字节数组参数)的偏移量,而不是从文件的开头。
您应该只在附加模式下打开流,并在读取n个字节的数据时开始写入,n是文件中已存在的字节数。