2011-04-28 4 views
3

내가 생각하는 것처럼 FileOutputStream이 작동한다는 일부 확인을 찾고 있습니다. 파일을 다운로드하는 중이고 네트워크 연결이 끊어지면 다운로드를 다시 시작하려고합니다.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(); 
} 

답변

4

RandomAccessFile 클래스도 살펴 봐야합니다. 그러면 파일을 자르지 않고 특정 위치로 이동하여 쓰기 시작할 수 있습니다.

+0

도움이 될 것입니다! 감사! – CaseyB

2

api doc을 더 자세히 읽어야합니다.

추가가 아닌 FileOutputStream을 열면 항상 파일의 내용이 지워지고 처음부터 쓰게됩니다. 또, write 메소드의 오프셋 인수는, 파일의 선두로부터가 아니라, 데이터의 선두로부터의 오프셋 (바이트 배열 인수)입니다.

스트림을 추가 모드로 열면 n 바이트의 데이터를 읽었을 때 쓰기 시작해야합니다. n은 이미 파일에있는 바이트 수입니다.

+0

미안하지만 API 문서를 더 자세히 읽을 필요가 있습니다. 파일에 바이트를 기입하기 위해서 사용하는 버퍼 사이즈가 오프셋 (offset)보다 작은 경우, write 메소드는 IndexOutOfBoundsException를 Throw합니다. 다운로드는 언제든지 일시 중지 될 수 있으므로 99.9999 %의 오프셋이 버퍼 크기 (예 : 1024)보다 높습니다. 해결 방법은 seek 메서드를 사용하여 RandomAccessFile을 사용하는 것입니다. –

+1

귀하의 의견을 한마디도 이해하지 못했습니다. 내 대답은'write (byte [] b, int off, int len)'메소드의'off' 인자는 파일의 시작 부분이 아니라'b' 인수의 시작 부분으로부터의 오프셋이라는 것입니다. 스트림이 씁니다. 파일에 이미 n 바이트가 들어 있고 m> n 인 경우 m 바이트를 다운로드하는 경우 파일을 추가 모드로 열고 다운로드 한 첫 번째 바이트를 무시하고 마지막으로 다운로드 한 (m - n) 바이트 만 씁니다 바이트. –