2011-09-03 4 views
0

eof을 포함한 이진 파일을 읽어야합니다. 파일 끝까지 이진 파일을 읽는 방법?

나는 DataInputStream

DataInputStream instr = new DataInputStream(new BufferedInputStream(new FileInputStream(fileName))); 

을 사용하여 파일을 읽고 난 정수로 이진 파일을 읽을 수 readInt();을 사용했다.

try { 
    while (true){ 
     System.out.println(instr.readInt()); 
     sum += instr.readInt(); //sum is integer 
    } 
} catch (EOFException eof) { 
    System.out.println("The sum is: " + sum); 
    instr.close(); 
} 

그러나이 프로그램은 파일 끝 또는 텍스트 줄 (텍스트 파일 인 경우)을 읽지 않습니다. 텍스트 파일에 한 줄의 텍스트 만 포함 된 경우 합계는 0입니다. 도와주세요.

예 : .txt 파일에 텍스트가 포함되어있는 경우.

a 
b 
c 

readInt();은 단지 ab 읽습니다.

+0

어쩌면 내가 당신을 misundertood,하지만 "파일 끝"문자가 없음) ((다음 내용 사용) 및 .nextLine 더 좋을 수도 있습니다 읽을 수 있습니다. –

+1

설명해주십시오 : _ 텍스트 파일에 한 줄의 텍스트 만 포함 된 경우 합계는 0._ –

+0

입니다. 달성하고자하는 것이 확실하지 않지만 _DataInputStream_이 잘못된 선택입니다. 숫자 목록을 한 줄씩 읽고 싶습니까? – home

답변

3

실제로 정상입니다. int가 아닌 바이트를 읽으려고합니다. readInt() 메서드는 4 바이트를 함께 int로 녹입니다.

은의 당신의 예제 파일을 분석하자 a, \n, b, \n, c :

a 
b 
c 

이 완전히 5 바이트입니다.
\n은 개행 문자입니다.

readInt() 메서드는 네 번째 첫 번째 바이트를 가져 와서 int를 만듭니다. 즉, 두 번째 호출을 시도하면 남은 바이트가 1 개만 남아 있기 때문에 충분하지 않습니다.

대신 readByte()을 사용해보십시오. 그러면 모든 바이트가 하나씩 반환됩니다.

public final int readInt() throws IOException { 
     int ch1 = in.read(); 
     int ch2 = in.read(); 
     int ch3 = in.read(); 
     int ch4 = in.read(); 
     if ((ch1 | ch2 | ch3 | ch4) < 0) 
      throw new EOFException(); 
     return ((ch1 << 24) + (ch2 << 16) + (ch3 << 8) + (ch4 << 0)); 
    } 
파일의 끝에 도달

, -1read() 방법에서 리턴된다


입증하기는 이것이 readInt()있어서의 본체이고, 그 4 배 read()을 칼스. 이것이 EOF 예외가 감지되는 방법입니다. 귀하의 경우에는

0

리더를 사용하고

FileReader reader = new FileReader(fileName); 
Scanner scanner = new Scanner(reader); 
String sum; 
while (scanner.hasNext()) { 
    sum += scanner.next()) { 
} 
reader.close(); 
System.out.println("The sum is: " + sum);