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

Java如何正确读取TXT文件到EOF并将内容存入数组

代码存在的问题
  • 循环初始条件不成立:你初始化condition变量的值就是"EOF",同时循环判断条件写了condition != "EOF",程序刚进入循环判断时条件就不成立,循环体完全不会执行。且你全程没有修改过condition的值,这个判断逻辑完全冗余且错误。
  • 字符串比较方式错误:Java中判断字符串内容相等不能用==或!=,这两个运算符比较的是字符串对象的内存地址,不是字符串内容,正确的做法是调用equals()方法。
  • 打印逻辑错误:循环体内你固定打印mail[1],哪怕循环正常执行,也只会持续输出数组索引为1的元素,未读到索引1的位置时还会输出null。
  • 数组长度固定限制:你初始化的数组长度为500,如果文件实际行数超过500,超出的内容无法存储;如果行数不足500,数组剩余位置都是null,后续处理容易触发空指针异常。
  • 资源未释放:Scanner读取文件完成后没有调用close()方法关闭IO资源,会造成不必要的资源泄漏。
修复后的实现代码

如果是要读到操作系统的文件结束标记(即真正的文件末尾,不需要判断文件内容里的EOF字符串),可以用如下代码:

import java.io.File;
import java.io.FileNotFoundException;
import java.util.Scanner;

public class MailMessage {
    public static void main(String[] args) throws FileNotFoundException {
        int i = 0;
        // 固定长度数组,最多存500行
        String[] mail = new String[500];
        File file = new File("C:\\Users\\sailo\\eclipse-workspace\\mail.txt");
        Scanner mailInput = new Scanner(file);
        // 移除冗余的condition判断,hasNextLine()本身就会判断是否到文件末尾
        while (mailInput.hasNextLine() && i < 500) {
            mail[i] = mailInput.nextLine();
            // 打印当前读取的行
            System.out.println(mail[i]);
            i++;
        }
        mailInput.close();
        
        // 如果需要去掉数组里的空值,可以拷贝有效长度到新数组
        String[] validMail = new String[i];
        System.arraycopy(mail, 0, validMail, 0, i);
        // 后续可以使用validMail数组处理有效内容
    }
}

如果是要读到文件内容中出现"EOF"字符串为止,只需要修改循环逻辑即可:

import java.io.File;
import java.io.FileNotFoundException;
import java.util.Scanner;

public class MailMessage {
    public static void main(String[] args) throws FileNotFoundException {
        int i = 0;
        String[] mail = new String[500];
        File file = new File("C:\\Users\\sailo\\eclipse-workspace\\mail.txt");
        Scanner mailInput = new Scanner(file);
        while (mailInput.hasNextLine() && i < 500) {
            String currentLine = mailInput.nextLine();
            // 用equals判断当前行是不是EOF标记
            if ("EOF".equals(currentLine)) {
                break;
            }
            mail[i] = currentLine;
            System.out.println(mail[i]);
            i++;
        }
        mailInput.close();
    }
}

如果不想受固定数组长度的限制,推荐使用ArrayList存储读取到的内容:

import java.io.File;
import java.io.FileNotFoundException;
import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;

public class MailMessage {
    public static void main(String[] args) throws FileNotFoundException {
        List<String> mailList = new ArrayList<>();
        File file = new File("C:\\Users\\sailo\\eclipse-workspace\\mail.txt");
        Scanner mailInput = new Scanner(file);
        while (mailInput.hasNextLine()) {
            String currentLine = mailInput.nextLine();
            // 如果需要读到内容里的EOF为止,保留下面这个if判断,否则删掉
            if ("EOF".equals(currentLine)) {
                break;
            }
            mailList.add(currentLine);
            System.out.println(currentLine);
        }
        mailInput.close();
        // 如果需要转成数组可以调用toArray方法
        String[] mail = mailList.toArray(new String[0]);
    }
}

内容的提问来源于stack exchange,提问作者Nam Ngo Ngoc

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.03 09:15:03