2016-10-11 2 views
3

다음 코드가 있는데 어떤 이유로 파일 끝에 도달하지 않으므로 while 루프가 끝나지 않습니다.파일 판독기가 제대로 작동하지 않습니까?

public class Temp { 
FileReader fr; 

Temp() { 
    try { 
     fr = new FileReader("File path"); 
    } catch (FileNotFoundException e) { 
     e.printStackTrace(); 
    } 
} 

public static void main(String[] args) { 
    Temp ob = new Temp(); 

    try { 
     char c; 
     while ((c = (char) ob.fr.read()) != -1) { 
      System.out.println(c); 
     } 
     ob.fr.close(); 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } 
} 

아무도 내가이 문제를 해결할 수 있습니까? 미리 감사드립니다.

+0

이 그렇게 나쁜 곳이이에서 얻었 는가? 당신이하려고하는 것은 무엇이며, 누군가는 당신을 더 나은 참조로 안내 할 것입니다, 왜냐하면 이것은 사용되어서는 안되는 자바이기 때문입니다. – matt

+0

@matt 방금 파일 판독기 주제를 다시 방문했습니다. 그리고 나는 기본을 잊어 버렸다. ;) –

+0

따라서 FileReader는 문자 인코딩이 부족하여 사용하지 않는 것이 좋습니다. 더 나은 옵션은 [Files.newBufferedReader] (https://docs.oracle.com/javase/8/docs/api/java/nio/file/Files.html#newBufferedReader-java.nio.file)를 사용하는 것입니다. Path-java.nio.charset.Charset-) 다음으로 사용해야 할 것은 [ARM] (https://docs.oracle.com/javase/tutorial/essential/exceptions/tryResourceClose.html)입니다. 너무 부정적이지는 않겠지 만, 방금이 프로그램을 시작 했으므로 현재 올바른 기술을 사용하는 것이 훨씬 낫습니다. 건배. – matt

답변

6

유형 -1을 가진 c - char을 -1과 비교합니다. 그러지 마. c에서 int까지 홍보하므로 65535 대신 종료됩니다. 대신 cint으로 만들고 루프 본문 내에 char으로 캐스트를 수행하십시오.

나는 또한 단지 변수에 무언가를 저장을 위해 새로운 객체를 생성에 대해 조언을 줄
int c; 
while ((c = ob.fr.read()) != -1) { 
    System.out.println((char) c); 
} 

... 당신이 여기에 FileReader에 대한 로컬 변수를 사용했을 수 있습니다.

또한 좋을 걸 :

  • 단지 아무것도
  • 사용하여 잘못 됐을 없었던 것처럼 예외가 발생하면 계속하지 않으려 고 -와 - 자원 대신 수동으로 독자
  • 방지를 폐쇄 FileReader은 항상 기본 인코딩을 사용하기 때문에 시작해야합니다. (AN InputStreamReaderFileInputStream를 사용하거나 자바 7에서 불과 Files.newBufferedReader를 사용합니다.)
+0

감사합니다. 알았다. :) –

관련 문제