2012-02-27 6 views
1

나는 올바른 접근 방식은FileReader 만 사용하여 파일을 읽을 수 있습니까?

BufferedReader br = new BufferedReader(FileReader(file)); 

알고하지만 난 자바에서 확인을 FileReader 클래스의 메서드를 API와 그것을 읽은 문자를 돌려 read() 방법이있다. 그러나 그것은 나를 위해 일하지 않습니다. 이 텍스트 줄이 들어있는 파일을 읽는 중입니다. "파일을 읽는 중입니다."라고 화면에 인쇄하고 있지만 프로그램을 실행하면 각 문자에 해당하는 ASCII 코드가 인쇄됩니다.

String lectura = ""; 
try{ 
    lectura = String.valueOf(fr.read()); 
} catch(IOException ioex){ 
    ioex.printStackTrace(); 
} 

while((Integer.parseInt(lectura)) != -1){ 
    System.out.print(lectura); 
    try{ 
     lectura = String.valueOf(fr.read()); 
    } catch(IOException ioex){ 
     ioex.printStackTrace(); 
    } 
} 

답변

5

이입니다.

해당 정수에 대해 String.valueOf()를 호출하면 호출 할 것으로 예상되는 String.valueOf (char c) 메서드 대신 String.valueOf (int i) 메서드가 호출되기 때문에 ASCII 값을 문자 값 대신 문자열로 반환합니다.

그래서 대신 독자가 문자를 읽고,

lectura = String.valueOf((char) (fr.read())); 
+0

거의 - int는 ASCII 값이 아니며 FileReader는 플랫폼의 기본 인코딩을 사용합니다. –

+0

차이점은 무엇입니까? – CodeBlue

+1

글쎄, 파일이 정상적인 7 비트 ASCII 문자로 쓰여진다면 아무런 차이가 없을 것입니다. 그러나 텍스트 편집기가 latin1을 사용하여 작성한 경우 fr.read()는 유효한 ASCII 코드가 아닌 int를 반환합니다. ('Charset.defaultCharset()'이 UTF-8과 같은 것일 경우 말도 안되는 것을 되돌릴 수 있습니다.) –

1

을 FileReader의 readint를 반환

이 내 코드입니다. 이것을 char으로 전송하면됩니다. 단지 char을 반환하지 않습니다

이유 Readerreadint를 사용하여이 파일의 끝을 나타 내기 위해 -1을 사용할 수 있다는 것입니다.

2

예상되는 동작입니다. 텍스트는 바이트로 저장되며 각 바이트는 문자의 ASCII 값을가집니다. 이러한 바이트를 바이트 배열로 수집 한 다음 새 String (array)을 사용할 수 있습니다. 그들을 문자열로 변환합니다. 또는 char로 변환하여 개별 문자를 변환 할 수도 있습니다. 리턴 된 정수는 그 문자에 해당하는 ASCII 코드 있지만

fr.read(), 정수가 아닌 문자를 반환 - 무슨 일이 일어나고 무엇

+1

의 InputStream가 바이트를 읽어보십시오. (혼란스럽게 만드는 것은 둘 모두 int로 인코딩된다는 것입니다.) 이것이 InputStreamReader가 Charset을 필요로하는 이유입니다. ASCII로 작동 할지라도 바이트를 문자로 취급하는 것은 올바르지 않습니다. Reader로부터 바이트 배열을 만들고 새로운 문자열 (byte [])를 호출하기를 원하지 않을 것입니다; 당신은 문자 배열을 만들고'new String (char [])'을 부를 것입니다. –

관련 문제