Java 只能识别CR LF的扫描仪

Java 只能识别CR LF的扫描仪,java,java.util.scanner,Java,Java.util.scanner,我正在使用scanner类读取文件。我希望我的EOL分隔符为CR LF,但文件中有些记录只有LF,因此我的扫描仪正在读取LF并转到下一行。我希望扫描仪仅在同时遇到CR和LF时才能转到下一行。 下面是我的代码片段:(在正则表达式中使用双斜杠也会得到相同的结果) 所以你需要一个分隔符 "\r\n" “[\r\n]”表示下列之一\r\n 分隔符确定“单词”之间的分隔符。要拆分该行,可以使用split(“~”),如下所示 ByteArrayInputStream inputStream = new B

我正在使用scanner类读取文件。我希望我的EOL分隔符为CR LF,但文件中有些记录只有LF,因此我的扫描仪正在读取LF并转到下一行。我希望扫描仪仅在同时遇到CR和LF时才能转到下一行。
下面是我的代码片段:(在正则表达式中使用双斜杠也会得到相同的结果)


所以你需要一个分隔符

"\r\n"
“[\r\n]”
表示下列之一\r\n

分隔符确定“单词”之间的分隔符。要拆分该行,可以使用split(“~”),如下所示

ByteArrayInputStream inputStream = new ByteArrayInputStream((
        "a line~with a \r and~a \n in it \r\n" +
        "a line with \n\r in~it\r\n").getBytes());

Scanner sMain = new Scanner(inputStream,"UTF-8").useDelimiter("\r\n");
Pattern wordPattern = Pattern.compile("~");
while (sMain.hasNext()) {
    String line = sMain.next();
    line = line.replaceAll("\r", "\\\\r").replaceAll("\n", "\\\\n");
    String[] words = wordPattern.split(line);
    System.out.println(Arrays.toString(words));
}
印刷品

[a line, with a \r and, a \n in it ]
[a line with \n\r in, it]

请尝试
(\r\n |\r |\n)
,正则表达式引擎默认值将首先尝试匹配第一个选项。

可能是在扫描后打印它。问题不在于正则表达式。彼得是对的: 以下是正确的:

"\r\n"
但请记住,如果打印,单个\n或\r仍被视为换行符。因此,它可能会显示为更多行。以下测试代码对此进行了说明:

public class ScannerTest {

 public static void main(String[] args) {
   Scanner sc = new Scanner("I am first \r\n I am second \n Am I? \r Really?");
   sc.useDelimiter(Pattern.compile("\r\n"));
   int count=0;
   while (sc.hasNext()) {
          count++;
          System.out.println(sc.next());      
   }

   System.out.println("Total No of Lines:"+count);

   }

} 

请注意,扫描仪读取的行数为2。

如果您在Windows计算机上,您可以尝试使用System.getProperty(“line.separator”)作为模式。我不知道这是否有帮助,因为我现在无法尝试。是的,我知道这会起作用,但我正在使用scanner,我的代码围绕它运行,所以我不想更改它。您是否像这样尝试过:Pattern.compile(“(\r\n)”)?我两者都要。我猜\r代表CR,而\n代表LF,对吗?我希望扫描仪转到下一行,如果它同时得到\r和\n您想要的
\r
,然后是
\n
,这意味着您想要
\r\n
,我很抱歉。我现在必须工作。我犯的错误是使用scanner.nextLine()而不是你建议的scaneer.next()。Thanx a t增加可用内存,和/或在获得文件时对其进行处理,以避免在内存中存储太多。您还可以确保启用了
-XX:+UseCompressedStrings
。顺便说一句:下面是一个加载一个8 TB大文件的示例。“巨大”可以指任何东西您可以单独计算文件中
\r\n
\n
\r
的数量,并假设最常见的表示源。如果代码< > \n>代码>是行的末尾或行的中线,你就不能说(没有附加信息)。这对我来说不起作用。每当我遇到LF时,这将再次转到下一行。我希望只有当我遇到我想说的话时,它才能转到下一行,但是当我遇到LR时,扫描仪仍然在为我分裂
public class ScannerTest {

 public static void main(String[] args) {
   Scanner sc = new Scanner("I am first \r\n I am second \n Am I? \r Really?");
   sc.useDelimiter(Pattern.compile("\r\n"));
   int count=0;
   while (sc.hasNext()) {
          count++;
          System.out.println(sc.next());      
   }

   System.out.println("Total No of Lines:"+count);

   }

}