【问题标题】:Java scanner read only the first line of a fileJava 扫描器只读取文件的第一行
【发布时间】:2018-09-05 08:24:51
【问题描述】:

我编写此代码是因为我需要读取文件的某些行以获取数据并将它们放入对象中。 问题是扫描仪只读取第一行。 我尝试使用此打印System.out.println(sc.hasNext()); 并调试代码,但是当第一个循环执行时,while 条件 (sc.hasNext()) 返回 false 。 但在文件中有 2 行。

Scanner sc =null;
    int[] counter=new int[users.length];


    for(int i=0;i<users.length-1;i++){
        sc= new Scanner(new FileReader("src/MailListUser"+String.valueOf(i+1)+".txt")).useDelimiter("\\s*^^\\s*");
        while(sc.hasNext()){
            String mail =sc.next();
            String [] data= mail.split(":::");
            Email email;
            String dat=data[5].replaceAll("_", " ");
            DateFormat format = new SimpleDateFormat("EEE MMM dd HH:mm:ss Z yyyy",Locale.ENGLISH);
            Date date = format.parse(dat);
            email = new Email(data[1],data[2],data[3],data[4],date,Integer.parseInt(data[6]));
            if(i+1==1) {
                counter[i]++;
                mbUser1.add(email);
            }
            else if(i+1==2){
                counter[i]++;
                mbUser2.add(email);
            }
            else if(i+1==3){
                counter[i]++;
                mbUser3.add(email);
            }

        }

    }
    sc.close();

有代码。 该文件包含:

^^:::user1@unito.it:::user1@unito.it:::grbvfcsx:::yrdfsx:::Wed_Sep_05_09:25:51_CEST_2018:::-1568000361:::^^
  ^^:::user1@unito.it:::user1@unito.it:::rgvfcdsx:::trvedcs:::Wed_Sep_05_09:27:53_CEST_2018:::482784668:::^^

此文件的每一行都以 ^^ 开头并以 ^^ 结尾

我不明白为什么这段代码只能读取一行

【问题讨论】:

  • 在此行之前:String dat=data[5].replaceAll("_", " "); 您应该检查数据是否不为空且至少包含 6 个项目。您还应该转义 ^^,因为 ^ 匹配一行的开头
  • @ScaryWombat 我尝试使用 bufferedReader 但仅当 data[4] 中的字符串只有一行时才有效,但此字符串需要有一行或多行,例如“hello \n你好吗?\n 再见” .... 实际上我使用扫描仪,因为它提供了 useDelimiter 方法来分隔我尝试读取的文件的每一行,有什么类似于 bufferedReader 中的 useDelimiter 吗?
  • @StephaneM 它不可能是空的,因为当我写它我另一个类我向自己保证它永远不会为空。此外,数据肯定至少有 6 项,因为 split 方法每次都会拆分他的字符串它找到“:::”,当我写这行时,我保证写分隔符“:::”
  • @ScaryWombat 实际上这里 link 写的是在 bufferedReader 中没有使用分隔符

标签: java java.util.scanner filereader


【解决方案1】:

在正则表达式中,^ 是一个特殊字符。它代表输入的开始,而不仅仅是字符 ^ 本身。

你需要在你的模式中转义它:

"\\s*\\^\\^\\s*"

【讨论】:

  • 我把这个字符串 "\\s*\\^\\^\\s*" 作为参数放在 useDelimiter 方法中,但结果是一样的。像下面这样的多行字符串,扫描仪可以读取,因为第 4 到第 5 ::: 超过 1 行 ^^:::user3@unito.it:::user1@unito.it:::object:::multiple line text:::Wed_Sep_05_14:11:44_CEST_2018:::466540663:::^^
  • @duca 你说“结果是一样的”。恐怕我不得不不相信你,并要求你重新检查你的结果,而不是说“结果是一样的”来描述你观察到的实际上是什么新结果。
  • 对不起,你说得对,这是我的错误,因为它只用于结束一个字符串,例如 mystring^^ 而不是以与 ^^mystring^^ 相同的模式,感谢您的帮助
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-04-20
  • 2014-01-31
  • 1970-01-01
  • 2011-12-18
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多