Java는 파일 크기를 얻습니다
오늘날 코드를 작성할 때는 파일 크기를 얻는 기능을 구현해야합니다. 현재 두 가지 구현 방법이 있습니다. 하나는 파일 길이 () 메소드를 사용하는 것입니다. 다른 하나는 fileInputStream의 사용 가능한 () 메소드를 사용하는 것입니다. inputStream이 읽기 작업을 수행하지 않으면 사용 가능한 ()의 크기는 파일 크기와 같아야합니다. 그러나 큰 파일을 다룰 때 후자의 문제가 발생합니다. 봅시다 :
이 예에서는 CentOS 6.5의 설치 이미지 파일을 사용했는데, 주로이 파일이 충분히 크다는 것을 고려했습니다 (2GB보다).
1. 파일 길이 () 메소드를 사용하십시오
public static void main (string [] args) {file f = 새 파일 ( "d : //centos-6.5-x86_64-bin-dvd1.iso"); if (f.exists () && f.isfile ()) {logger.info (f.length ()); } else {logger.info ( "파일이 존재하지 않거나 파일이 아님"); }}출력을 살펴 보겠습니다.
4467982336
결과는 4.16GB이며 Windows에 표시된 결과와 일치합니다.
다음으로 FileInputStream을 통해 얻은 파일 크기를 살펴 보겠습니다.
public static void main (String [] args) {fileInputStream fis = null; try {file f = 새 파일 ( "d : //centos-6.5-x86_64-bin-dvd1.iso"); fis = 새로운 fileInputStream (f); logger.info (fis.available ()); } catch (예외 e) {logger.error (e); } 마침내 {if (null! = fis) {try {fis.close (); } catch (ioexception e) {logger.error (e); }}}}}실행 결과는 다음과 같습니다.
2147483647
이 결과는 익숙해 보입니까? integer.max_value는 서명 된 정수가 나타내는 최대 값입니다.
따라서 친숙한 장치로 변환하면 파일 크기가 이런 식으로 얼마나 큰가요?
그것은 약 2GB이며, 이는 분명히 올바른 결과가 아닙니다.
그 이유는 파일의 길이 () 메소드에 의해 반환 된 유형이 길고, 긴 유형이 나타내는 양수 값의 최대 값은 다음과 같습니다. 9223372036854775807. 최대 지원으로 변환 할 수있는 최대 파일 크기는 8954730132868714 eb bytes입니다. 이 규모는 인간 IT 발전의 역사에서 수년 동안 사용될 것입니다. pileInputStream의 사용 가능한 () 메소드의 반환 값은 int입니다. 최대 표현 범위는 이전에 도입되었습니다. 지원할 수있는 최대 파일 크기는 1.99GB 이며이 순서에 쉽게 도달 할 수 있습니다.
2014 년 3 월 31 일에 추가 :
스트리밍 방법을 위해 큰 파일 크기를 읽을 수는 없지만 더 이상 Java.io.*에서 기존 패키지를 사용할 수 없습니다.*. 여기에서 java.nio.* -filechannel 아래에 새로운 도구를 사용해야합니다. 다음 샘플 코드를 살펴 보겠습니다.
public static void main (String [] args) {filechannel fc = null; try {file f = 새 파일 ( "d : //centos-6.5-x86_64-bin-dvd1.iso"); if (f.exists () && f.isfile ()) {fileInputStream fis = new FileInputStream (f); fc = fis.getChannel (); logger.info (fc.size ()); } else {logger.info ( "파일이 존재하지 않거나 파일이 아님"); }} catch (filenotfoundException e) {logger.error (e); } catch (ioexception e) {logger.error (e); } 마침내 {if (null! = fc)) {try {fc.close (); } catch (ioexception e) {logger.error (e); }}}}}Filechannel을 사용한 후 얻은 결과는 첫 번째 사례와 일치하며 파일의 정확한 크기를 정확하게 설명합니다.
이것은 또한 모든 기술 동료에게 큰 파일을 읽을 때 숨겨진 버그를 피하기 위해 int-type 데이터에주의해야하며이를 찾기가 어렵다는 것을 상기시킵니다.
읽어 주셔서 감사합니다. 도움이되기를 바랍니다. 이 사이트를 지원 해주셔서 감사합니다!