【问题标题】:How to reset Scanner?如何重置扫描仪?
【发布时间】:2016-04-21 17:55:36
【问题描述】:

我想读取一个文本文件并将每一行放入一个字符串(字符串数组)中。然而,这需要扫描文件两次,一次是为了弄清楚有多少行,另一次是创建一个该大小的字符串数组。但它会引发错误,并且重置方法似乎不起作用。

    FileReader read = null;

    try {
        read = new FileReader("ModulesIn.txt");
        //scan through it and make array of strings - for each line
        Scanner scan = new Scanner(read);
        while(scan.hasNextLine()){
            numOfMods++;
            scan.nextLine();
        }

        scan.reset();

        lines = new String[numOfMods];

        for(int i = 0; i < numOfMods; i++)
            lines[i] = scan.nextLine();

这是相关代码的 sn-p。

【问题讨论】:

标签: java java.util.scanner nosuchelementexception


【解决方案1】:

“但是这需要扫描文件两次...” ...

不,它没有。请参阅@Exziled 的答案以获得更好(更简单、更有效)的方法,它不会扫描文件两次。

但要回答您的问题,无法将 Scanner 重置为流的开头。您需要重置底层流,然后创建一个新的Scanner。 (当然,某些类型的流不支持重置。)

作为记录,Scanner.reset() 方法重置了扫描器的分隔符、区域设置和数字基数状态。它不会重新定位扫描仪。

【讨论】:

    【解决方案2】:

    跳过使用标准数组...扫描文件然后再次扫描是浪费时间。使用具有动态大小的数组列表,然后将其转换为标准数组。

     BufferedReader in = new BufferedReader(new FileReader("path/of/text"));
            String str;
    
            List<String> list = new ArrayList<String>();
            while((str = in.readLine()) != null){
                list.add(str);
            }
    
            String[] stringArr = list.toArray(new String[0]);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-03-17
      • 2015-10-02
      • 1970-01-01
      • 2015-09-06
      • 2020-12-03
      • 1970-01-01
      • 1970-01-01
      • 2015-11-23
      相关资源
      最近更新 更多