2014-04-02 5 views
1
내가의 OutputStream으로 파일을 보낼

에서이 자바없는 NegativeArraySizeException 바이트

은 그래서

byte[] = new byte[size of file ]를 사용하지만 최대 크기는 내가 사용할 수있는 무엇인지 모른다.

이것은 내 코드입니다.

File file = new File(sourceFilePath); 
     if (file.isFile()) { 
      try { 
       DataInputStream diStream = new DataInputStream(new FileInputStream(file)); 
       long len = (int) file.length(); 
       if(len>Integer.MAX_VALUE){ 
        file_info.setstatu("Error"); 
       } 
       else{ 
       byte[] fileBytes = new byte[(int) len]; 
       int read = 0; 
       int numRead = 0; 
       while (read < fileBytes.length && (numRead = diStream.read(fileBytes, read, 
         fileBytes.length - read)) >= 0) { 
        read = read + numRead; 
       } 

       fileEvent =new File_object(); 
       fileEvent.setFileSize(len); 
       fileEvent.setFileData(fileBytes); 
       fileEvent.setStatus("Success"); 
       fileEvent.setSender_name(file_info.getSender_name()); 
       } 
      } catch (Exception e) { 
       e.printStackTrace(); 
       fileEvent.setStatus("Error"); 
       file_info.setstatu("Error"); 
      } 
     } else { 
      System.out.println("path specified is not pointing to a file"); 
      fileEvent.setStatus("Error"); 
      file_info.setstatu("Error"); 
     } 

미리 감사드립니다.

답변

0

글쎄, 이것은 파일을 읽는 아주 위험한 방법입니다. Java의 int은 32 비트 int이므로 long이 64 비트 인 반면 -2147483648 - 2147483647 범위에 있습니다.

일반적으로 프로그램이 큰 파일에서 RAM을 소모 할 수 있으므로 전체 파일을 한 번에 읽지 마십시오. 대신 FileReader 위에 BufferedReader을 사용하십시오.

3

당신이 예외를 받고있는 이유는이 라인이다 : 높은 순서 비트가 폐기되기 때문에

long len = (int) file.length(); 

intlong에서 축소 변환은 기호의 변화가 발생할 수 있습니다. JLS Chapter 5, section 5.1.3을 참조하십시오. 관련 인용문 :

부호가있는 정수를 정수 유형 T로 축소하면 n 개의 하위 비트 (n은 유형 T를 나타내는 데 사용되는 비트 수)가 제외됩니다. 가능한 경우 숫자 값의 크기에 대한 정보가 손실되면 결과 값의 부호가 입력 값의 부호와 다를 수 있습니다.

당신은 간단한 프로그램으로이를 테스트 할 수 있습니다

: 당신은 어쨌든 메모리에 전체 파일을 읽을 바이트 배열을 사용하지 않아야하지만,이 문제를 해결하기 위해

long a = Integer.MAX_VALUE + 1; 
    long b = (int) a; 
    System.out.println(b); # prints -2147483648 

, 그렇지 파일 길이를 int로 캐스트하십시오. 그런 다음 다음 행을 확인하십시오.

long len = file.length();