正在加载...

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 程序不会创建该文本文件。

Reader prints oak from note.txt

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 停止。

Reader missing file throws

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("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,读本课的文件读取任务已完成,你可以进入写文件的下一主题。

🧠 测试您的知识

准备开始

测试您的知识

通过这个互动测验挑战自己,看看你对这个主题的理解程度如何

❓
5
问题
🎯
70%
及格要求
♾️
∞
时间
🔄
∞
尝试次数

📝 说明

  • 仔细阅读每个问题
  • 为每个问题选择最佳答案
  • 您可以随时重新参加测验
  • 您的进度将显示在顶部