作为一名Java开发工程师,在日常开发中我们经常需要与用户进行交互、读取数据或者保存数据。输入(Input)与输出(Output) 是程序与外界沟通的重要方式。
本文将带你全面了解 Java中的输入输出机制,涵盖:
- 控制台输入输出
- 文件读写操作
- 常用IO流介绍(字节流 vs 字符流)
- 缓冲流的使用技巧
- 异常处理建议
- 实际开发中的最佳实践
🧱 一、什么是输入输出(I/O)?
在Java中,输入输出(I/O) 指的是程序与外部设备之间的数据交换过程。常见的输入源包括键盘、鼠标、网络、文件等;输出目标可以是显示器、打印机、网络或文件。
Java 提供了丰富的 I/O API,位于 java.io 和 java.nio 包中。
🖥️ 二、控制台输入输出(标准输入输出)
1. 输出:System.out
Java 中最常用的输出方式是使用 System.out.println() 或 System.out.print()。
System.out.println("Hello, World!"); // 输出并换行
System.out.print("Java is fun. "); // 不换行
✅
println()自动换行,print()不换行
✅ 支持字符串、变量、表达式等多种类型输出
2. 输入:Scanner 类
要从控制台获取用户输入,可以使用 java.util.Scanner 类。
示例:读取基本类型输入
import java.util.Scanner;
public class InputExample {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
System.out.print("请输入你的名字:");
String name = scanner.nextLine(); // 读取整行输入
System.out.print("请输入你的年龄:");
int age = scanner.nextInt();
System.out.println("你好," + name + ",你今年 " + age + " 岁。");
scanner.close();
}
}
常用方法:
| 方法 | 说明 |
|---|---|
nextLine() | 读取一行文本(含空格) |
nextInt() | 读取一个整数 |
nextDouble() | 读取一个浮点数 |
nextBoolean() | 读取布尔值 |
⚠️ 注意:
- 使用完
Scanner后应调用close()关闭资源。- 多次读取时注意缓冲区问题(如
nextInt()后接nextLine()需处理换行符)。
📄 三、文件输入输出(File I/O)
1. 写入文件:FileWriter / BufferedWriter
将内容写入文件,可以使用 FileWriter 或更高效的 BufferedWriter。
示例:写入文本文件
import java.io.BufferedWriter;
import java.io.FileWriter;
import java.io.IOException;
public class WriteToFile {
public static void main(String[] args) {
try (BufferedWriter writer = new BufferedWriter(new FileWriter("output.txt"))) {
writer.write("这是第一行\n");
writer.write("这是第二行");
System.out.println("写入完成!");
} catch (IOException e) {
e.printStackTrace();
}
}
}
✅ 使用 try-with-resources 确保自动关闭流
✅\n表示换行
2. 读取文件:FileReader / BufferedReader
从文件中读取内容,推荐使用 BufferedReader 提高效率。
示例:读取文本文件
import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
public class ReadFromFile {
public static void main(String[] args) {
try (BufferedReader reader = new BufferedReader(new FileReader("output.txt"))) {
String line;
while ((line = reader.readLine()) != null) {
System.out.println(line);
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
✅
readLine()逐行读取,适用于大文件
✅ 使用异常处理避免运行时错误
🔁 四、字节流 vs 字符流
| 对比项 | 字节流(InputStream/OutputStream) | 字符流(Reader/Writer) |
|---|---|---|
| 处理单位 | 字节(8位) | 字符(16位 Unicode) |
| 适用场景 | 二进制文件(图片、视频) | 文本文件(字符编码转换) |
| 主要类 | FileInputStream, FileOutputStream | FileReader, FileWriter |
🧩 五、常用IO流一览表
| 流类型 | 类名 | 功能描述 |
|---|---|---|
| 字节输入流 | InputStream | 基类,用于读取字节 |
| 字节输出流 | OutputStream | 基类,用于写入字节 |
| 字符输入流 | Reader | 基类,用于读取字符 |
| 字符输出流 | Writer | 基类,用于写入字符 |
| 文件字节输入流 | FileInputStream | 从文件读取字节 |
| 文件字节输出流 | FileOutputStream | 向文件写入字节 |
| 缓冲字节输入流 | BufferedInputStream | 提高读取效率 |
| 缓冲字节输出流 | BufferedOutputStream | 提高写入效率 |
| 缓冲字符输入流 | BufferedReader | 支持按行读取 |
| 缓冲字符输出流 | BufferedWriter | 支持高效写入 |
🧪 六、NIO简介(Java New IO)
从 JDK 1.4 开始引入 NIO(New IO),提供了更高效的文件操作方式,主要位于 java.nio.file 包中。
示例:使用 NIO 读取文件
import java.nio.file.Files;
import java.nio.file.Paths;
import java.io.IOException;
import java.util.List;
public class NIOReadExample {
public static void main(String[] args) {
try {
List<String> lines = Files.readAllLines(Paths.get("output.txt"));
for (String line : lines) {
System.out.println(line);
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
✅ 更简洁的API
✅ 支持路径操作和文件属性访问
✅ 更适合现代Java项目(如Spring Boot)
🧯 七、异常处理建议
- 使用 try-catch 捕获
IOException - 推荐使用 try-with-resources 自动关闭资源
- 对于大文件建议使用缓冲流(BufferedXXX)
- 文件路径需确保正确,避免出现
FileNotFoundException
💡 八、实际开发中的最佳实践
| 场景 | 推荐做法 |
|---|---|
| 小型文本文件 | 使用 Scanner / BufferedReader |
| 大型文本文件 | 使用 BufferedReader 逐行读取 |
| 二进制文件处理 | 使用 FileInputStream / FileOutputStream |
| 文件复制/移动 | 使用 NIO 的 Files.copy() / move() |
| 日志记录 | 使用日志框架(如 Log4j、SLF4J) |
| 数据持久化 | 考虑使用数据库或序列化技术 |
📚 九、总结
| 类别 | 工具类 | 用途 |
|---|---|---|
| 控制台输入 | Scanner | 获取用户输入 |
| 控制台输出 | System.out | 打印调试信息 |
| 文件读取 | BufferedReader / Scanner / Files.readAllLines() | 读取文本内容 |
| 文件写入 | BufferedWriter | 写入文本内容 |
| 二进制操作 | FileInputStream / FileOutputStream | 图片、音频等文件处理 |
| 高效IO | BufferedInputStream / BufferedOutputStream | 提升性能 |
| 新一代IO | java.nio.file.Files | 更现代的API |
📎 十、附录:常见IO类及其用途速查表
| 类名 | 所属包 | 用途 |
|---|---|---|
Scanner | java.util | 控制台输入解析 |
System.out | java.lang | 标准输出 |
BufferedReader | java.io | 高效读取文本 |
BufferedWriter | java.io | 高效写入文本 |
FileReader | java.io | 读取字符文件 |
FileWriter | java.io | 写入字符文件 |
FileInputStream | java.io | 读取字节文件 |
FileOutputStream | java.io | 写入字节文件 |
Files | java.nio.file | 文件操作工具类 |
如果你正在准备一篇面向初学者或团队成员的技术博客,这篇内容将帮助他们快速理解 Java 中的输入输出机制,并能立即上手实践。
欢迎点赞、收藏、转发,也欢迎留言交流你在实际开发中遇到的IO相关问题,我们下期再见 👋
📌 关注我,获取更多Java核心技术深度解析!