Java 扫描器 hasNext() 跳过空行
Java Scanner hasNext() skips empty lines
我要使用的日志文件是制表符分隔的,如下所示:
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 个)的 LogFile 的 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
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
,因为值没有第三个值。
如@Thilo 所述,"\t+"
上的拆分应该可以解决您的问题
其他人所说的问题是数组中有空条目,即
["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 ...
我要使用的日志文件是制表符分隔的,如下所示:
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 个)的 LogFile 的 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
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
,因为值没有第三个值。
如@Thilo 所述,"\t+"
上的拆分应该可以解决您的问题
其他人所说的问题是数组中有空条目,即
["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 ...