如何检查行尾是否是 \n 或 \r 或 JAVA 中的 \r\n

How to check if on the end of line is \n or \r or \r\n in JAVA

我需要检查文件中的每个字符并将其转换为字节。但不幸的是,扫描仪没有提供任何不拆分行的最后一个字符的可能性...... 我尝试做这样的事情:

        Scanner in = new Scanner(new File(path));
        List<Byte> byteList = new ArrayList<>();
        while (in.hasNextLine()) {
            String a = in.nextLine();
            if (in.hasNextLine()) {
                a = a + (char) (13);
            }
            for (char c : a.toCharArray()) {
                byteList.add((byte) c);
            }
        }
        byte[] bytes = new byte[byteList.size()];
        for (int i = 0; i < byteList.size(); i++) {
            bytes[i] = byteList.get(i);
        }
        return bytes;
    }

您对解决这个问题有什么想法吗? 我会很感激你的帮助。

您不能使用 Scanner.readLine()BufferedReader.readLine() 执行此操作,因为这两个 API 都使用行分隔符。

你可以想象使用 Scanner.next() 和自定义分隔符正则表达式来实现它,这会导致行分隔符包含在标记中。 (提示:使用后视。)

但是对于您在代码中实际执行的操作,FileInputStreamFileReader 会更好。


这让我想到了另一件事。

这段代码应该做什么?

它实际上做的是通过丢弃最高位将 Unicode 代码单元转换为字节。如果输入字符集是 ASCII 或(可能)LATIN-1,这可能有意义。但除此之外,它可能会破坏文本。

  • 如果您尝试以(原始)字节读取文件,只需使用 FileInputStream + BufferedInputStream。然后直接读取/处理字节。行终止符不需要任何特殊处理。

  • 如果您尝试将文件读取为某些字符集中的编码字符,并将其音译为另一个字符集(例如 ASCII)。您应该写信给 FileWriter + BufferedWriter。再一次,行分隔符/终止符将被保留......你可以根据需要“规范化”它们。

  • 如果您正在做其他事情...嗯,这可能不是正确的做法。 List<Byte> 将变得低效且难以转换为其他 Java API 可以直接处理的内容。

以单个字符串形式读取整个文件,包括所有行结尾:

String fileStr = in.useDelimiter("\A").next();

正则表达式 \A 匹配输入的开始,这是从未遇到过的,因此 整个 输入流从 next().[=16= 返回]

如果您的情况需要将所有行结尾更正为特定行结尾,无论文件包含什么,请执行以下操作:

fileStr = fileStr.replaceAll("\R", "\n");

正则表达式 \R 匹配所有类型的行结尾。

当然这一切都可以作为 1 行来完成:

String fileStr = in.useDelimiter("\A").next().replaceAll("\R", "\n");