2010-10-27 67 views
6

我使用Java SE 6有沒有一個標準的API來檢查Java中的行分隔符?

我的程序讀取多種類型的文件,從DOS到UNIX和ASCII的爲Unicode,我必須確保輸出文件的行分隔符匹配輸入文件。

我這樣做的方式是使用BufferedReader的read()函數讀取示例行,以搜索第一行分隔符並將該行分隔符保存爲String。這種方式可以在稍後需要新線時使用。

我檢查掃描儀類,發現可能的行分隔符可以包括以下內容:

\r\n 
\r 
\n 
\u2028 
\u2029 
\u0085 

是否有一個庫函數來檢查這些字符?或者甚至更好,是否已有庫函數來檢查輸入的行分隔符是什麼樣子?

有沒有其他解決方法呢?

編輯: 如果可能,我想使用Java的標準API而不是第三方庫,但所有的建議是最受歡迎的。編號: 只是爲了澄清。
1)輸入文件不依賴於程序運行的位置。例如,如果我在Dos中運行這個程序,我仍然可以得到一個Unix輸入文件。
2)我的目標不是讀取用分隔符分隔的每一行 - 這很簡單。我真正需要的是使用與輸入文件相同的行分隔符編寫輸出文件。例如,如果我在Dos中運行該程序,並且得到一個Unix輸入文件,我希望能夠使用Unix行分隔符寫入我的輸出文件。這就是爲什麼我問是否有一個標準API根據輸入文件檢測行分隔符,而不是運行OS。

謝謝。

回答

3

以上三個答案並沒有真正解決這個問題。 OP想要從給定文件中確定:該文件中使用的行分隔符是什麼?

對於給定文件,此問題無法得到明確回答,因爲該文件可能使用了多行結尾。這看起來可能有點麻煩,但這是可能的。

所以對我來說,最好的辦法似乎是解析輸入文件自己,計數可能線的出現結束字符序列,並選擇最經常出現這個文件的行分隔符。

我還沒有遇到一個實現這個功能的庫。

+1

「可能看起來有點麻煩」 - 例如,它絕對不是一個邊緣情況 - java unix將大型機響應的日誌文件或不同來源的複製粘貼文本。我永遠不會假定文件只有一種類型的行分隔符。 – 2014-12-04 00:38:25

1

BufferedReader和readLine()至少會自動處理行結束標記的前三個變體。

+0

我認爲這是更好的解決方案,不需要硬編碼那些\ n和\ r的東西。 – user1686407 2018-01-28 08:53:59

0

我已經找了很長的時間爲這個api。但找不到。

我使用類似的方法來讀取與正則表達式的第一行分隔符。

我不得不花一些時間讓正確的正則表達式工作,並希望這個答案會有代碼。所以我最後寫了一些東西:

/** 
* <h1> Identify which line delimiter is used in a string </h1> 
* 
* This is useful when processing files that were created on different operating systems. 
* 
* @param str - the string with the mystery line delimiter. 
* @return the line delimiter for windows, {@code \r\n}, <br> 
*   unix/linux {@code \n} or legacy mac {@code \r} <br> 
*   if none can be identified, it falls back to unix {@code \n} 
*/ 
public static String identifyLineDelimiter(String str) { 
    if (str.matches("(?s).*(\\r\\n).*")) {  //Windows //$NON-NLS-1$ 
     return "\r\n"; //$NON-NLS-1$ 
    } else if (str.matches("(?s).*(\\n).*")) { //Unix/Linux //$NON-NLS-1$ 
     return "\n"; //$NON-NLS-1$ 
    } else if (str.matches("(?s).*(\\r).*")) { //Legacy mac os 9. Newer OS X use \n //$NON-NLS-1$ 
     return "\r"; //$NON-NLS-1$ 
    } else { 
     return "\n"; //fallback onto '\n' if nothing matches. //$NON-NLS-1$ 
    } 
} 
相關問題