2012-09-02 59 views
1

我有一堆.txt文件我正在嘗試閱讀,但對於其中許多人來說他們不會閱讀。那些不會讀取的文字看起來在文本之前以空行開始。例如下面拋出一個NoSuchElementException:掃描儀無法讀取文本文件

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()); 
} 

其中被讀取的文本文件,開始一個空行,然後一些文本。我也嘗試過使用input.skip(「[\\ s] *」)來跳過任何前導空白,但它會拋出相同的錯誤。有沒有辦法解決這個問題?

編輯: 該file託管在谷歌文檔。如果您下載並在文本編輯器中查看,您可以看到它所在的空行。

+0

「 摘要 工作壓力可以被定義爲有害的......」當我複製並粘貼在評論欄中它顯示在下一行空行,然後是「抽象」,那麼長行。格式和空行會丟失,但它會發布雖然.. – user1470948

+0

與掃描儀輸入的默認分隔符,您的代碼應該打印該文件的第一個單詞,即使開始時存在空行(\ n)。當您調用下一個方法時,它會自動搜索將分隔符留在一邊的第一個有效令牌。 你最好把文件內容放在這裏,而不是作爲評論,但編輯你的問題發佈。 –

+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; 
    } 

兩個這些方法要求您明確提供encoding,而不是依賴通常不是Unicode的default encoding(另請參閱standard constants。)

代碼是Java 7語法,未經測試。

+0

非常感謝這是我所需要的。我玩弄了可用的字符集,並發現ISO-8859-1適用於這些文件。我只需要將我的掃描儀構建爲掃描儀(新文件(「文件/路徑」),「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

在我的實際代碼中,我確實有一段時間(input.hasNext())塊,但問題是hasNext()方法的計算結果爲false,並且它從不讀取任何文件。 – user1470948

0

掃描儀讀取所有的單詞或數字到行的末尾。此時你需要調用nextLine()。如果你想避免得到一個異常,你需要調用其中一個hasNextXxxx()方法來確定是否可以讀取該類型。