2017-10-25 5 views
-3
java에서 서버 프로그램에서 읽는 동안 나는 모호한 출력을 얻고있다

을 읽는 동안 감지 :-1 파일 자바

byte [] mybytearray = new byte [content_length]; 
InputStream inputStream = clientSocket0.getInputStream(); //Getting input 
from peer0 
FileOutputStream fileOutputStream = new FileOutputStream(fileDownloaded); 
//Sending the output to local directory 
BufferedOutputStream bufferedOutputStream = new 
BufferedOutputStream(fileOutputStream); 

bytesRead = inputStream.read(mybytearray,0,content_length); 
System.out.println("First read : " +bytesRead); 
current = bytesRead; 
if(bytesRead!=content_length) { 
       current = bytesRead; 
       do { 
         System.out.println(current +"-Current"); 
         System.out.println("Read it : "+(mybytearray.length-current)); 
         bytesRead = 
           inputStream.read(mybytearray, current, (mybytearray.length-current)); 
          System.out.println("***"+bytesRead); 
         if(bytesRead == -1) { 
          //current = content_length; 
          break; 
         } 
         else 
          current += bytesRead; 
        } while(current < content_length); 
       } 

       bufferedOutputStream.write(mybytearray, 0 , current); 

       bufferedOutputStream.flush(); 
       bufferedOutputStream.close(); 
       inputStream.close(); 
       inFromServer0.close(); 

그것은 일부 파일에 대한 다음과 같은 출력을주고있다 :

내용 길이 33996을
C : \ 사용자 \ 수밋 \ 자식 \ IP_Task2 작업 1 \ Peer1/rfc8183.txt.pdf \
먼저 읽기 : 24,356
24356 - 현재
읽기 그것은 : 9640
*** - 1

루프의 bytesRead은 -1하여 올바른 파일을 만들 수 없습니다.

+0

코드를 올바르게 포맷하십시오. 최신 버전의 자바를 사용한다면 수동으로'InputStream.close()'를 호출하는 대신 try-with-resources를 사용하십시오. – omajid

답변

1

메소드를 사용할 때마다 반환 할 수있는 값을 확인하기 위해 설명서를 읽어야합니다.

가 최대 len 바이트의 데이터를 읽어 IOException이 께

공개 INT 읽기 (바이트 [] B, INT 오프 렌을 INT) 예외 :

InputStream.read(byte[], int, int)의 설명에서보세요 입력 스트림로부터 바이트 배열에 전송합니다. len 바이트만큼 읽으려고 시도하지만 더 작은 수를 읽을 수 있습니다. 실제로 읽힌 바이트 수는 정수로 반환됩니다.

이 메서드는 입력 데이터를 사용할 수 있거나 파일 끝 부분이 감지되거나 예외가 발생할 때까지 차단합니다.

len이 0이면 읽은 바이트가없고 0이 반환됩니다. 그렇지 않으면 적어도 하나의 바이트를 읽으려고합니다. 스트림이 파일의 끝에 있기 때문에 사용할 수있는 바이트가 없으면 -1 값이 반환됩니다. 그렇지 않으면 적어도 하나의 바이트를 읽고 b에 저장합니다.

첫번째 바이트의 판독은 다음 [1 + OFF] B로 한 등, [오프] b를 소자에 저장된다. 읽은 바이트 수는 len과 같아야합니다. k를 실제로 읽은 바이트 수라고합니다. 이러한 바이트는 요소 b [off] ~ b [off + k-1]에 저장되어 요소 b [off + k] ~ b [off + len-1]는 영향을받지 않습니다. B의 [오프] 및 B [b.length를-1]을 통해 소자 B [LEN + OFF] 통해 모든 경우

요소 B [0]는 영향을받지 않는다.

InputStream 클래스의 read (b, off, len) 메서드는 단순히 read() 메서드를 반복적으로 호출합니다. 최초의 호출로 IOException가 발생했을 경우, 그 예외는 read (b, off, len) 메소드의 호출로부터 돌려 주어집니다. 이후의 read()의 호출로 IOException가 발생하면 (자), 예외는 캐치되어 마치 파일의 마지막 인 것처럼 다루어집니다. 그 시점까지 읽힌 바이트는 b에 격납되어 예외가 발생하기 전에 읽힌 바이트 수가 돌려 주어집니다. 이 메소드의 디폴트 구현은, 요구 된 양의 입력 데이터 len가 읽히거나, 파일의 말미가 검출되거나, 예외가 Throw 될 때까지 블록합니다. 서브 클래스는,이 메소드의보다 효율적인 구현을 제공 할 필요가 있습니다.

매개 변수 :

b - the buffer into which the data is read. 

off - the start offset in array b at which the data is written. 

len - the maximum number of bytes to read. 

결과 :

the total number of bytes read into the buffer, or -1 if there is no more data because the end of the stream has been reached. 

은 매우 신중하게 그 마지막 줄을 읽어보십시오. -1은 InputStream에서 사용할 수있는 추가 입력이 없으므로 데이터를 읽지 않았 음을 의미하는 특수 반환 값입니다.

+0

안녕하세요 Omajid, 응답 해 주셔서 감사합니다. 나는 여전히 코드를 배우는 중이며, close()를 처리 할 것이다. . 하지만 내 질문은 : 파일의 콘텐츠 길이는 33996 바이트입니다. 처음 읽으면 24356 바이트 만 읽습니다. 그래서 다음번에 24356에서 33996까지 읽으라는 지시를 받았습니다. 이는 9640 바이트입니다. 그러나 그것은 9640 출력을 제공하지 않습니다. 오히려 -1을줍니다. – ARP

+0

어딘가에 버그가 있습니다. InputStream에서 읽는 소켓이 사용자에게 데이터를 제공하지 않습니다. Java 플랫폼의 버그 일 수 있지만 네트워크의 다른 쪽이 연결을 중단하는 가능성이 훨씬 큽니다. 이 데이터를 보내는 것은 무엇입니까? 모든 데이터를 전송하고 있는지 확인할 수 있습니까? – omajid