2012-12-14 112 views
7

因此,我在使用Scanner類從文件讀取內容時遇到了一個有趣的問題。基本上,我試圖從目錄中讀取由解析應用程序生成的幾個輸出文件,以計算一些準確度度量。用java掃描儀讀取文件的怪異行爲

基本上,我的代碼只是遍歷目錄中的每個文件,並用掃描器打開它們以處理內容。無論出於何種原因,掃描儀都沒有讀取一些文件(所有UTF-8編碼)。即使這些文件不是空的,scanner.hasNextLine()在第一次調用時會返回false(我打開調試器並觀察它)。我每次都直接用File對象初始化掃描器(成功創建文件對象)。即:

File file = new File(pathName); 
    ... 
    Scanner scanner = new Scanner(file); 

我試了幾件事情,並最終能夠通過以下方式初始化掃描儀來解決這個問題:

Scanner scanner = new Scanner(new FileInputStream(file)); 

雖然我很高興已經解決了這個問題,我仍然很好奇,以前可能會發生什麼事情導致問題。有任何想法嗎?非常感謝!

+0

我在一起竊取一些東西,遇到了確切的問題。 FileInputStream來拯救! – masher

回答

3

根據Java中的Scanner.java源6u23新線由

private static final String LINE_SEPARATOR_PATTERN = 
             "\r\n|[\n\r???]"; 
private static final String LINE_PATTERN = ".*("+LINE_SEPARATOR_PATTERN+")|.+$"; 

檢測,因此您可以檢查您是否可以在不讀取文件匹配以下正則表達式的內容。

.*(\r\n|[\n\r???])|.+$ 

另外我會檢查是否有一些異常提出。

更新: 這讓我很好奇,我尋找答案。看來你的問題已經被問和已經在這裏解決: Java Scanner(File) misbehaving, but Scanner(FIleInputStream) always works with the same file

總結這是關於超出ASCII字符,所表現的不同取決於你是否初始化文件或的FileInputStream掃描儀。

+0

沒有例外,我在try catch塊中包含了代碼。我查看了導致問題的文件 - 每個文件都是由應用程序生成的,並且是標準的機器可讀格式。文件夾中有100個文件,其中5個導致了這個問題。因爲生成文件的應用程序實際上是以標準方式構建它們,所以我期望行分隔符正在工作。我會繼續並確保正則表達式存在於這些文件中。 – shaunvxc

+0

然而,奇怪的部分是,當我用FileInputStream而不是文件初始化掃描器時,它一切正常 - 它讀取內容完美無缺。 – shaunvxc

+0

剛剛找到答案,請參閱我的更新。 – Will

0

我會嘗試檢查您是否總是在閱讀文件後關閉掃描儀。你也只需要調用hasNextLine()和nextLine(),或者你在該掃描器上調用另一個nextXXX()方法?

+0

對不起,我應該包括在我的問題 - 是的,我在每個文件後關閉掃描器,我只是調用hasNextLine()和nextLine()。對於導致問題的特定文件,第一次調用hasNextLine()返回false。 – shaunvxc

+0

您是否在嘗試從這些「奇怪」文件讀取時調試掃描儀? – Behnil

+0

是的,當我查看Scanner對象時,它的緩衝區完全是空的。 – shaunvxc