Java 中读取文件
在与程序相同的文件夹里准备一个名为 note.txt 的纯文本文件,写入一行短内容:oak。打开 Reader.java,为 note.txt 创建 File,包进 Scanner,打印 nextLine(),然后 close 扫描器。用 javac Reader.java 编译并运行 java Reader。屏幕应显示 oak。第二个演示改为打开 missing.txt,并以 FileNotFoundException 停止。把用 Java 写文件留到下一页——本课请你在编辑器里手动创建 note.txt。
读取磁盘上已有的行
前面的页面在遇到你捕获或抛出的异常时停止。本页接触到程序结束后仍留在文件里的字母。打开教学文件 Reader.java。保持公共类名 Reader 与文件名一致。删除残留的 Signal 抛出演示、Guard 的 catch 块、Alarm 数组停止,以及任何从 System.in 用键盘 nextLine 读取的 Scanner。程序不应等待输入。读文件仍用 Scanner,但构造函数接收 File,不是键盘。
文件顶部需要三行 import:
import java.io.File;
import java.io.FileNotFoundException;
import java.util.Scanner;
给 main 加上 throws FileNotFoundException,让缺失文件以受检异常出现。在 main 里命名磁盘文件:
File note = new File("note.txt");
在该文件上构建扫描器:
Scanner scan = new Scanner(note);
打印第一行:
System.out.println(scan.nextLine());
结束读取:
scan.close();
编译前在 Reader.java 旁创建 note.txt,在第一行准确输入 oak。保存文本文件。本页的 Java 程序不会创建该文本文件。
import java.io.File;
import java.io.FileNotFoundException;
import java.util.Scanner;
public class Reader {
public static void main(String[] args) throws FileNotFoundException {
File note = new File("note.txt");
Scanner scan = new Scanner(note);
System.out.println(scan.nextLine());
scan.close();
}
}
在同时包含 Reader.java 和 note.txt 的文件夹中运行 javac Reader.java。括号、花括号和分号匹配时,javac 不会输出自己的行。然后运行 java Reader——不是 java Reader.java。运行命令不要带 .java 后缀。如果 javac 找不到 File 或 Scanner,说明 import 缺失或拼错——先修复它们再查其他错误。
屏幕显示 oak。扫描器从磁盘文件读取第一行并打印。程序不应等待键盘输入。如果终端等待你打字,说明 Scanner 仍连在 System.in 而不是 File note。修正构造函数使其接收 File。若看到 empty 或 IllegalArgumentException 堆栈,说明还在运行 Signal 残留——换用读文件教学文件运行 java Reader。若看到 2 或 blocked,说明仍在运行旧的 Alarm 或 Guard。
走一次成功路径。Java 从 Reader.main 开始。File 对象保存名称 note.txt。Scanner 打开该名称。nextLine 取出第一行。println 显示 oak。close 结束扫描器。不应再打印别的内容。若文件夹没有 note.txt,先创建文本文件再运行。
此处的 nextLine 指文件里的下一行,不是向用户提示。输入页之后这个方法名容易混淆:同名方法,不同来源。字母 oak 活在文本文件中;Java 类只负责读取。
📊 File and Scanner roles
| Piece | What it does on this page |
|---|---|
| File | holds the disk name such as note.txt |
| Scanner | reads lines from that File with nextLine |
| close | finishes the Scanner read so the file handle is released |
缺失的名称会抛出 FileNotFoundException
第二个程序保持相同结构,但指向机器上不存在的名称:missing.txt。不要创建该文件。运行应以 FileNotFoundException 停止。
import java.io.File;
import java.io.FileNotFoundException;
import java.util.Scanner;
public class Reader {
public static void main(String[] args) throws FileNotFoundException {
File note = new File("missing.txt");
Scanner scan = new Scanner(note);
System.out.println(scan.nextLine());
scan.close();
}
}
用 javac Reader.java 编译,然后运行 java Reader。这次程序不会打印 oak。终端报告 FileNotFoundException。main 上的 throws 让该受检异常在本页无需 catch 即可离开 main。你之前练习过 catch;此处重点是认识缺失文件名会阻断读取。讨论时要写对:FileNotFoundException。只说「错误」对本课太模糊。
若误创建了 missing.txt,删除它或把字符串改回不存在的名称。想要安静屏幕显示 oak 时优先用成功的 note.txt 演示。仅为观察 FileNotFoundException 才保留缺失名演示。有意识地切换文件,避免在一个 main 里混淆成功读取与缺失停止。
不要在本页发明用 Java 写来创建 note.txt。在编辑器里建文本文件就够练习读取。下一页是用 Java 写文件。本页保留清晰的读取与清晰的缺失停止。
与 Signal 上的 throw 对比
在 throw 页面,java Signal 在杯子为空时用 IllegalArgumentException 停止。本页缺失文件的停止是 FileNotFoundException,成功路径会打印磁盘上的一行。若附近仍有 Signal 文件可当作历史;文件演示请运行 java Reader 以匹配本课屏幕。
包装类、数组和 catch 历史留在历史里。今天的新记号是 File、文件上的 Scanner、来自磁盘的 nextLine 和 FileNotFoundException。
本页为写文件留下什么
本页只读取已存在的文件,或在名称缺失时停止。下一页展示如何用 Java 把字母写入文件。请停留在读取 oak 和说出 FileNotFoundException。尚勿在这些 Reader 演示中强制加入写调用。
写文件之前
你可以用 Scanner 读 note.txt 并看到 oak。可以打开 missing.txt 并看到 FileNotFoundException。编译 Reader.java 并依次对每个保留演示运行 java Reader。在类文件旁手动创建 note.txt。下一页是写文件,程序自己保存文本。
保留成功读取换来安静屏幕,保留缺失演示观察停止,把 Java 写入挡在本页之外。当 note.txt 存在时 java Reader 后出现 oak,读本课的文件读取任务已完成,你可以进入写文件的下一主题。
🧠 测试您的知识
测试您的知识
通过这个互动测验挑战自己,看看你对这个主题的理解程度如何
📝 说明
- 仔细阅读每个问题
- 为每个问题选择最佳答案
- 您可以随时重新参加测验
- 您的进度将显示在顶部