是否有标准API来检查Java中的行分隔符?

是否有标准API来检查Java中的行分隔符?,java,Java,我正在使用JavaSE6 我的程序读取多种文件,从dos到unix,从ascii到unicode,我必须确保输出文件的行分隔符与输入文件匹配 我这样做的方法是使用BufferedReader read()函数读取一个示例行,以搜索第一行分隔符并将该行分隔符保存为字符串。这样以后只要我需要一条新线路,就可以使用它 我已经检查了Scanner类,并注意到可能的行分隔符可能包括以下内容: \r\n \r \n \u2028 \u2029 \u0085 是否有用于检查这些字符的库函数?或者更好的是,是

我正在使用JavaSE6

我的程序读取多种文件,从dos到unix,从ascii到unicode,我必须确保输出文件的行分隔符与输入文件匹配

我这样做的方法是使用BufferedReader read()函数读取一个示例行,以搜索第一行分隔符并将该行分隔符保存为字符串。这样以后只要我需要一条新线路,就可以使用它

我已经检查了Scanner类,并注意到可能的行分隔符可能包括以下内容:

\r\n
\r
\n
\u2028
\u2029
\u0085
是否有用于检查这些字符的库函数?或者更好的是,是否已经有一个库函数来检查输入的行分隔符是什么样子的

还有其他办法吗

编辑: 如果可能的话,我希望使用Java的标准API而不是第三方库,但所有建议都是非常受欢迎的

编辑: 只是想澄清一下。
1) 输入文件不依赖于此程序运行的位置。例如,如果我在Dos下运行这个程序,我仍然可以得到一个Unix输入文件。
2) 我的目标不是读取用行分隔符分隔的每一行——这很简单。我真正需要的是使用与输入文件相同的行分隔符编写输出文件。例如,如果我在Dos下运行这个程序,并且得到一个Unix输入文件,我希望能够使用Unix行分隔符编写输出文件。这就是为什么我要问是否有一个标准的API来检测基于输入文件的行分隔符,而不是运行操作系统


谢谢。

BufferedReader和readLine()至少会自动处理前三种类型的行尾标记。

您可以从
System.properties(“line.separator”)
中获取操作系统行分隔符前面的三个答案并不能真正解决这个问题。OP希望从给定文件中确定:此文件中使用的行分隔符是什么

对于给定的文件,这个问题无法明确回答,因为该文件可能使用多个行尾。这似乎是人为的,但这是可能的

因此,对我来说,最好的方法似乎是自己解析输入文件,计算可能出现的行尾字符序列,并选择最常出现的一个作为该文件的行分隔符


我还没有遇到一个可以实现此功能的库。

我已经寻找了很长一段时间的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$
    }
}
/**
*标识字符串中使用的行分隔符
*
*这在处理在不同操作系统上创建的文件时非常有用。
*
*@param str-带神秘线分隔符的字符串。
*@返回windows的行分隔符,{@code\r\n},
*unix/linux{@code\n}或旧版mac{@code\r}
*如果无法识别,则返回到unix{@code\n} */ 公共静态字符串identifyLineDelimiter(字符串str){ 如果(str.matches(“(?s)。*(\\r\\n)。*”){//Windows/$NON-NLS-1$ 返回“\r\n”/$NON-NLS-1$ }else如果(str.matches(“(?s)。*(\\n)。*”){//Unix/Linux/$NON-NLS-1$ 返回“\n”/$NON-NLS-1$ }else if(str.matches(“(?s)。*(\\r)。*”){//Legacy mac os 9。较新的os X使用\n//$NON-NLS-1$ 返回“\r”/$NON-NLS-1$ }否则{ 返回“\n”;//如果没有匹配项,则返回到“\n”。//$NON-NLS-1$ } }
“可能看起来有些做作”-例如,这绝对不是边缘案例-带有大型机响应的java unix日志文件,或者从不同来源复制粘贴的文本。我决不会假设一个文件只有一种类型的行分隔符。我认为这是更好的解决方案,不需要硬编码这些内容。