【问题标题】:Java Scanner hasNext() skips empty linesJava Scanner hasNext() 跳过空行
【发布时间】:2019-12-27 11:04:25
【问题描述】:

我要使用的日志文件是制表符分隔的,如下所示:

2019-06-06 10:01:02     1.0
2019-06-06 10:25:12 100.0
2019-06-06 11:02:32     2.0

我使用以下代码扫描文件:

import java.util.*;
import java.io.*;

public class FirstTry {
    public static void main(String[] args) 
    {
        String fileName = "LogFile.csv";
        File file = new File(fileName);
        try
        {
            Scanner inputStream = new Scanner(file);
            while (inputStream.hasNext()){
                String data = inputStream.nextLine();
                String[] values = data.split("\\t");
                System.out.println(values[0] + "    " + values[1]);
            }
            inputStream.close();
        }
        catch (FileNotFoundException e) {
            e.printStackTrace();
        }
    }
}

线

System.out.println(values[0] + "    " + values[1]);

打印以下工作输出:

2019-06-06 10:01:02    
2019-06-06 10:25:12    100.0
2019-06-06 11:02:32    

但是

System.out.println(values[0] + "    " + values[2]);

打印:

2019-06-06 10:01:02    1.0
Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException

为什么会在 values[2] 而不是 values [1] 中引发此异常?

编辑: 标有标签(共 5 个)的日志文件的 Sublime Text 屏幕截图:

编辑 2:

String[] values = data.split("\\t+");
System.out.println(values[0] + "    " + values[1]);

打印:

2019-06-06 10:01:02    1.0
2019-06-06 10:25:12    100.0
2019-06-06 11:02:32    2.0

System.out.println(values[0] + " " + values[2]);导致java.lang.ArrayIndexOutOfBoundsException

【问题讨论】:

  • 日期和时间之间真的有制表符吗?
  • 你确定有一个标签(正如@RobAu所说)?这将是唯一的解释。
  • 我编辑了问题并发布了日志文件的屏幕截图。
  • 尝试在\\t+上拆分以处理多个连续的标签。

标签: java java.util.scanner next


【解决方案1】:

String[] values = data.split("\\t");的结果

1: ["2019-06-06 10:01:02", "", "1.0"]
2: ["2019-06-06 10:25:12", "100.0"]
3:[“2019-06-06 11:02:32”,“”,“2.0”]

请注意,双重制表将拆分为一个空字符串。 在第 2 行,有一个表格导致 ArrayOutOfBoundsException,因为 values 没有第三个值。

正如@Thilo 提到的,"\\t+" 上的拆分应该可以解决您的问题

【讨论】:

  • 我明白为什么会引发异常。 "\\t+" 将所有值 (100,1.0,2.0) 放入 value[1]。
【解决方案2】:

其他人所说的问题是数组中有空条目,即

["2019-06-06 10:01:02", "", "1.0"]

因此您需要删除所有此类条目。使用 Java 8 可以这样做:

// You have the "values" array now do this...
String[] correctValues = Arrays.stream(values)
            .filter(value ->
                    value != null && value.length() > 0
            )
            .toArray(size -> new String[size]);
// Rest of the code ...

【讨论】:

    猜你喜欢
    • 2013-03-28
    • 1970-01-01
    • 2012-05-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-07-30
    • 1970-01-01
    • 2018-03-07
    相关资源
    最近更新 更多