입력을 처리 할 때는 Scanner
유형이 이상하게 일치하지 않습니다. 그것은 I/O 예외를 삼킨다 - 소비자는 test for these explicitly이어야한다 - 그래서 그것은 독자들에게 에러를 알리지 못한다. 그러나 문자 데이터를 디코딩 할 때 유형이 엄격합니다. 잘못 인코딩 된 텍스트 나 잘못된 인코딩을 사용하면 IOException
이 발생하고 유형은 즉시 삭제됩니다.
이 코드는 오류 검사 텍스트 파일의 모든 행을 읽습니다
public static List<String> readAllLines(File file, Charset encoding)
throws IOException {
List<String> lines = new ArrayList<>();
try (Scanner scanner = new Scanner(file, encoding.name())) {
while (scanner.hasNextLine()) {
lines.add(scanner.nextLine());
}
if (scanner.ioException() != null) {
throw scanner.ioException();
}
}
return lines;
}
이 코드는 디코더가 마크 질문을 이해하지 못하는 라인을 읽고 코드 포인트로 변환 :
public static List<String> readAllLinesSloppy(File file, Charset encoding)
throws IOException {
List<String> lines = new ArrayList<>();
try (InputStream in = new FileInputStream(file);
Reader reader = new InputStreamReader(in, encoding);
Scanner scanner = new Scanner(reader)) {
while (scanner.hasNextLine()) {
lines.add(scanner.nextLine());
}
if (scanner.ioException() != null) {
throw scanner.ioException();
}
}
return lines;
}
모두를 이러한 방법을 사용하면 default encoding에 자주 의존하지 않고 encoding을 명시 적으로 제공해야합니다 (standard constants 참조)
코드는 Java 7 구문이며 테스트되지 않았습니다.
" 요약 작업 스트레스는 유해한 것으로 정의 될 수 있습니다 ..."나는 이것을 주석 상자에 복사하여 붙여 넣으면 빈 줄이 표시되고 다음 줄에는 "추상"이 표시되고 긴 줄이 표시됩니다. 비록 공백 인 경우 (\ n) 시작 부분에 공백이있는 경우에도 서식 입력란과 공백 줄은 스캐너 입력의 기본 구분 기호로 – user1470948
을 게시 할 때 손실됩니다. 코드는 파일의 첫 단어를 인쇄해야합니다. 다음 메소드를 호출 할 때, 구분 기호를 제쳐 놓고 첫 번째 유효한 토큰을 자동으로 검색합니다. 파일 내용을 주석이 아닌 여기에 넣는 것이 좋지만 질문을 편집하여 게시하십시오. –
다른 조언과는 별도로 '스캐너'는 I/O 오류를 숨기고이를 확인해야합니다 (http://docs.oracle.com/javase/7/docs/api/java/util/Scanner.html#ioException % 28 % 29). 텍스트 파일에 인코딩 오류가 있거나 잘못된 인코딩을 사용하여 파일을 읽으려고하면이 문제가 발생할 수 있습니다. – McDowell