【问题标题】:How to check if on the end of line is \n or \r or \r\n in JAVA如何在JAVA中检查行尾是否为\n或\r或\r\n
【发布时间】:2026-02-04 14:05:01
【问题描述】:

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

        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;
    }

您对这个问题的解决方案有任何想法吗? 我会很感激你的帮助。

【问题讨论】:

  • 所以不要使用扫描仪,使用 FileInputStream。

标签: java java.util.scanner


【解决方案1】:

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

您可以使用Scanner.next() 和自定义分隔符正则表达式来完成此操作,从而将行分隔符包含在标记中。 (提示:使用后视。)

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


这让我想到了另一件事。

这段代码应该做什么?

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

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

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

  • 如果您正在做其他事情......那么这可能不是正确的方法。 List&lt;Byte&gt; 效率低下且难以转换为其他 Java API 可以直接处理的内容。

【讨论】:

    【解决方案2】:

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

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

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

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

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

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

    当然这都可以用 1 行来完成:

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

    【讨论】: