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
相关产品推荐
相关产品推荐

