You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.13 19:25:42