我认为我做的事情非常愚蠢,但我是Java新手,所以请耐心等待。我正在使用FileReader和Scanner来读取.txt文件的行。抓住每一行后,我提取一些信息然后移动线。这就是我的简化方法:
Reader fileReader = new FileReader("test.txt");
Scanner scanner = new Scanner(fileReader);
public static textList(Scanner scanner){
while (scanner.hasNextLine()){
scanner.nextLine();
while(scanner.hasNext()){
// Extract information from each line and do some stuff with it
// using scanner.next();
}
}
}
// scanner is closed in the same method that creates it and the FileReader.
我的问题是,如果我将scanner.nextLine()
保留在原来的位置,我将始终跳过.txt文件的第一行,但如果我将其移至while( scanner.hasNextLine())
的末尾,当扫描程序到达.txt文件的末尾时,我得到“没有这样的行存在”异常。
非常感谢任何帮助和指导!
由于
答案 0 :(得分:1)
解决这个问题的一个简单方法就是按照this answer的方式完成它 - 这样你甚至可以很好地解决多个空格:
String data = scanner.nextLine();
String[] pieces = data.split("\\s+");
// Parse the pieces
因为.next()默认只返回空格之后的内容,使用它而不是这里没有任何好处。
答案 1 :(得分:1)
阅读每行5个令牌的文本文件的最佳方法是不使用Scanner
。
Scanner
速度很慢,往往表现得不像你想象的那样。
请改用BufferedReader
。并使用try-with-resources来关闭它。
try (BufferedReader reader = new BufferedReader(new FileReader("test.txt"))) {
for (String line; (line = reader.readLine()) != null; ) {
String[] tokens = line.split("\\s+");
// use tokens array here
}
}
对于更高级的行解析,您可以使用带有捕获组的完整正则表达式,而不是split()
。
Pattern p = Pattern.compile("(\\S+)\\s+(\\S+)\\s+(\\S+)\\s+(\\S+)\\s+(\\S+)");
try (BufferedReader reader = new BufferedReader(new FileReader("test.txt"))) {
for (String line; (line = reader.readLine()) != null; ) {
Matcher m = p.matcher(line);
if (! m.matches())
throw new IllegalArgumentException("Bad data: " + line);
String token1 = m.group(1);
String token2 = m.group(2);
String token3 = m.group(3);
String token4 = m.group(4);
String token5 = m.group(5);
// use tokens here
}
}
该代码与第一个示例相同,但强制每行必须有5个令牌。然后可以根据需要调整正则表达式,例如,使用\\d+
代替\\S+
来确保令牌3是一个数字。