2012-09-02 6 views
1

읽으려고하는 .txt 파일이 많지만 읽을 수는 없습니다. 읽을 수없는 것들은 텍스트 앞에 빈 줄로 시작하는 것처럼 보입니다. 텍스트 파일을 읽을스캐너가 텍스트 파일을 읽을 수 없습니다.

public static void main(String[] args) throws FileNotFoundException{ 
    Scanner input = new Scanner(new File("documentSets/med_doc_set/bmu409.shtml.txt")); 
    System.out.println(input.next()); 
} 

는 빈 줄 다음 텍스트로 시작 : 예를 들어, 다음은 예외 : NoSuchElementException가 발생합니다. 또한 input.skip ("[\\ s] *")을 사용하여 선행 공백을 건너 뛰었지만 동일한 오류가 발생했습니다. 이 문제를 해결할 수있는 방법이 있습니까?

편집 : file Google 워드 프로세서에서 호스팅됩니다. 텍스트 편집기에서보기 위해 다운로드하면 시작하는 빈 줄을 볼 수 있습니다.

+0

" 요약 작업 스트레스는 유해한 것으로 정의 될 수 있습니다 ..."나는 이것을 주석 상자에 복사하여 붙여 넣으면 빈 줄이 표시되고 다음 줄에는 "추상"이 표시되고 긴 줄이 표시됩니다. 비록 공백 인 경우 (\ n) 시작 부분에 공백이있는 경우에도 서식 입력란과 공백 줄은 스캐너 입력의 기본 구분 기호로 – user1470948

+0

을 게시 할 때 손실됩니다. 코드는 파일의 첫 단어를 인쇄해야합니다. 다음 메소드를 호출 할 때, 구분 기호를 제쳐 놓고 첫 번째 유효한 토큰을 자동으로 검색합니다. 파일 내용을 주석이 아닌 여기에 넣는 것이 좋지만 질문을 편집하여 게시하십시오. –

+0

다른 조언과는 별도로 '스캐너'는 I/O 오류를 숨기고이를 확인해야합니다 (http://docs.oracle.com/javase/7/docs/api/java/util/Scanner.html#ioException % 28 % 29). 텍스트 파일에 인코딩 오류가 있거나 잘못된 인코딩을 사용하여 파일을 읽으려고하면이 문제가 발생할 수 있습니다. – McDowell

답변

3

입력을 처리 할 때는 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 구문이며 테스트되지 않았습니다.

+0

고마워요. 이것이 내가 필요한 것입니다. 사용 가능한 문자셋을 가지고 놀았으며 파일에 대해 ISO-8859-1 작업을 발견했습니다. Scanner (새 파일 ("file/path"), "ISO-8859-1")로 스캐너를 구성하면됩니다. – user1470948

1

그것은 빈 줄에서 시작, 당신은 단지로 변경, 코드의 첫 번째 줄을 인쇄하고 있습니다 :

public static void main(String[] args) throws FileNotFoundException{ 
    Scanner input = new Scanner(new File("documentSets/med_doc_set/bmu409.shtml.txt")); 
    while(input.hasNextLine()){ 
     System.out.println(input.nextLine()); 
    } 
} 
+0

내 실제 코드에는 while (input.hasNext()) 블록이 있지만 문제는 hasNext() 메서드가 false로 평가되고 파일을 읽지 않는다는 것입니다. – user1470948

0

스캐너 라인의 끝까지 모든 단어 나 숫자를 읽습니다. 이 시점에서 nextLine()을 호출해야합니다. 예외를 얻지 않으려면 hasNextXxxx() 메서드 중 하나를 호출하여 해당 형식을 읽을 수 있는지 확인해야합니다.

관련 문제