如何找出哪个行分隔符 BufferedReader#readLine() 用于拆分行?

2022-09-04 07:14:14

我正在通过缓冲阅读器读取文件

String filename = ...
br = new BufferedReader( new FileInputStream(filename));
while (true) {
   String s = br.readLine();
   if (s == null) break;
   ...
}

我需要知道这些行是否由“\n”或“\r\n”分隔,有没有办法找到答案?

我不想打开FileInputStream,所以最初扫描它。理想情况下,我想问一下BufferedReader,因为它必须知道。

我很高兴覆盖BufferedReader来破解它,但我真的不想打开文件流两次。

谢谢

注意:当前行分隔符(由 System.getProperty(“line.separator”) 返回)无法使用,因为该文件可能已由另一个操作系统上的另一个应用程序写入。


答案 1

若要与 BufferedReader 类同期,可以使用以下方法处理 \n、\r、\n\r 和 \r\n 结束行分隔符:

public static String retrieveLineSeparator(File file) throws IOException {
    char current;
    String lineSeparator = "";
    FileInputStream fis = new FileInputStream(file);
    try {
        while (fis.available() > 0) {
            current = (char) fis.read();
            if ((current == '\n') || (current == '\r')) {
                lineSeparator += current;
                if (fis.available() > 0) {
                    char next = (char) fis.read();
                    if ((next != current)
                            && ((next == '\r') || (next == '\n'))) {
                        lineSeparator += next;
                    }
                }
                return lineSeparator;
            }
        }
    } finally {
        if (fis!=null) {
            fis.close();
        }
    }
    return null;
}

答案 2

在阅读了java文档(我承认自己是pythonista)之后,似乎没有一种干净的方法来确定特定文件中使用的行尾编码。

我能推荐的最好的事情是使用和迭代文件中的每个字符。像这样:BufferedReader.read()

String filename = ...
br = new BufferedReader( new FileInputStream(filename));
while (true) {
   String l = "";
   Char c = " ";
   while (true){
        c = br.read();
        if not c == "\n"{
            // do stuff, not sure what you want with the endl encoding
            // break to return endl-free line
        }
        if not c == "\r"{
            // do stuff, not sure what you want with the endl encoding
            // break to return endl-free line
            Char ctwo = ' '
            ctwo = br.read();
            if ctwo == "\n"{
                // do extra stuff since you know that you've got a \r\n
            }
        }
        else{
            l = l + c;
        }
   if (l == null) break;
   ...
   l = "";
}

推荐