StringTokenizer未读取文件首行问题求助
问题原因
你代码里的问题很明确:第一行被读取了但完全没处理。
你先执行了String line = reader.readLine();,这已经把文件的第一行读进了line变量,但接下来的while ((line = reader.readLine()) != null)直接覆盖了line的值,把第二行及以后的内容读进来处理,第一次读到的第一行就被彻底忽略了,自然不会出现在结果里。
修复方案
有两种简单的修复方式:
方式一:去掉多余的初始读取
直接在循环里完成第一行的读取和处理,这是最简洁的写法:
public class BufferReader { public static void main(String[] args) throws FileNotFoundException, IOException { BufferedReader reader = new BufferedReader(new FileReader("C://Java-projects//EsameJava//prova.txt")); List<String> str = new ArrayList<>(); String line; // 只声明变量,不提前读取 while ((line = reader.readLine()) != null) { StringTokenizer token = new StringTokenizer(line); while (token.hasMoreTokens()) { str.add(token.nextToken()); } } System.out.println(str); } }
方式二:先处理初始读取的第一行
如果不想改动循环结构,可以先把第一次读到的第一行处理完,再进入后续循环:
public class BufferReader { public static void main(String[] args) throws FileNotFoundException, IOException { BufferedReader reader = new BufferedReader(new FileReader("C://Java-projects//EsameJava//prova.txt")); String line = reader.readLine(); List<String> str = new ArrayList<>(); // 先处理第一行内容 if (line != null) { StringTokenizer token = new StringTokenizer(line); while (token.hasMoreTokens()) { str.add(token.nextToken()); } } while ((line = reader.readLine()) != null) { StringTokenizer token = new StringTokenizer(line); while (token.hasMoreTokens()) { str.add(token.nextToken()); } } System.out.println(str); } }
额外建议
StringTokenizer是Java早期的API,现在更推荐使用更灵活的String.split()或者Java 8+的流处理来拆分字符串,比如:
// 用split按空白字符拆分(支持多个连续空白) while ((line = reader.readLine()) != null) { String[] tokens = line.split("\\s+"); for (String token : tokens) { str.add(token); } }
或者用更简洁的流写法(还能自动关闭资源):
import java.io.BufferedReader; import java.io.FileReader; import java.io.IOException; import java.util.ArrayList; import java.util.Arrays; import java.util.List; import java.util.stream.Collectors; public class BufferReader { public static void main(String[] args) throws IOException { try (BufferedReader reader = new BufferedReader(new FileReader("C://Java-projects//EsameJava//prova.txt"))) { List<String> str = reader.lines() .flatMap(line -> Arrays.stream(line.split("\\s+"))) .collect(Collectors.toList()); System.out.println(str); } } }
内容的提问来源于stack exchange,提问作者Bruda
相关产品推荐
相关产品推荐

