2014-12-10 3 views
2

웹 사이트에서 파일을 다운로드하고 크기를 확인합니다 (운영 체제에서 크기를 바이트로 확인하면 동일).java 운영 체제와 파일 크기가 다른 이유

long size = Files.size(destFile.toPath()))); 

결과는 조작 system.Why에서 크기가 다른 :

 connection.getContentLength(); 
     int sizeBefore = connection.getContentLength(); 
     BufferedInputStream bufferedInputStream = new BufferedInputStream(connection.getInputStream()); 
     File destFile = new File(destFileName); 
     BufferedOutputStream bufferedOutputStream = new BufferedOutputStream(
       new FileOutputStream(destFile)); 

     while ((i = bufferedInputStream.read()) != -1) { 
       bufferedOutputStream.write(i);    
     } 
     long sizeAfter = destFile.length(); 
     bufferedOutputStream.flush(); 
     bufferedInputStream.close(); 

     if (sizeAfter == sizeBefore) { 
      log.debug("Downloaded file correct"); 
     } 

는 내가 다른 방법으로도 (NIO)으로 체크 저장된 파일을 tryed?

+0

어떻게 다운로드하셨습니까? getContentLength가 더 컸습니까? 즉, 다운로드 코드를 검사해야한다는 의미 일 수 있습니다. FTP를 사용하면 CR/CRLF 변환이 발생할 수 있습니다. –

+0

getContentLength()가 더 큽니다. – RomKazanova

+0

필자는 아마 오해했을 지 모르지만 서면 파일을 닫으면 파일 크기를 차지합니까? 불충분 한 서면으로 작성 코드를보고 싶습니다. –

답변

0

스트림을 닫기 전에 파일 크기를 점검하십시오. 나는 당신이 폐쇄하면 특히,의 BufferedOutputStream가 완전히 경우에만 버퍼를 작성합니다

long sizeAfter = destFile.length(); 
    bufferedOutputStream.flush(); 
    bufferedInputStream.close(); 

bufferedOutputStream.close(); // Close the file. Flushes too. 
    bufferedInputStream.close(); 
    long sizeAfter = destFile.length(); // Check its size on disk. 

을해야 운영 체제와 같은 크기를 얻을 수

connection.connect(); 
    int sizeBefore = connection.getContentLength(); 
    BufferedInputStream bufferedInputStream = new BufferedInputStream(connection.getInputStream()); 
    File destFile = new File (destFileName); 
    BufferedOutputStream bufferedOutputStream = new BufferedOutputStream(
      new FileOutputStream(destFile)); 
    while ((i = bufferedInputStream.read()) != -1) { 
     bufferedOutputStream.write(i); 
    } 
    bufferedOutputStream.flush(); 
    bufferedInputStream.close(); 
    long sizeAfter = destFile.length(); 
    if (sizeAfter==sizeBefore) { 
     log.info("Downloaded correct");     
    } 
4

이진 접두어 : 리눅스는 킬로바이트에서 1000 바이트를 사용하는 반면

http://en.wikipedia.org/wiki/Binary_prefix#Adoption_by_IEC_and_NIST

윈도우는 킬로바이트 (^ 10 2) 1024 바이트를 사용합니다. MB, GB 등으로 전파됩니다.

+0

좋은 소리는 있지만 접두어가없는 바이트로보고하지 않는 경우에만 관련이 있습니다. 이 사건이 여기 있었나요? – Trilarion

+0

운영체제의 계산 크기의 차이에 대해서는 묻지 않았다. – RomKazanova

1

의 선 것입니다 스트림 후에 할 채우는. 마지막 버퍼는 실제로 close() (flush())에 기록됩니다.

관련 문제