Java 输入与输出详解:从控制台到文件,掌握Java IO基础

193 阅读5分钟

 作为一名Java开发工程师,在日常开发中我们经常需要与用户进行交互、读取数据或者保存数据。输入(Input)与输出(Output) 是程序与外界沟通的重要方式。

本文将带你全面了解 Java中的输入输出机制,涵盖:

  • 控制台输入输出
  • 文件读写操作
  • 常用IO流介绍(字节流 vs 字符流)
  • 缓冲流的使用技巧
  • 异常处理建议
  • 实际开发中的最佳实践

🧱 一、什么是输入输出(I/O)?

在Java中,输入输出(I/O) 指的是程序与外部设备之间的数据交换过程。常见的输入源包括键盘、鼠标、网络、文件等;输出目标可以是显示器、打印机、网络或文件。

Java 提供了丰富的 I/O API,位于 java.iojava.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)
适用场景二进制文件(图片、视频)文本文件(字符编码转换)
主要类FileInputStreamFileOutputStreamFileReaderFileWriter

🧩 五、常用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图片、音频等文件处理
高效IOBufferedInputStream / BufferedOutputStream提升性能
新一代IOjava.nio.file.Files更现代的API

📎 十、附录:常见IO类及其用途速查表

类名所属包用途
Scannerjava.util控制台输入解析
System.outjava.lang标准输出
BufferedReaderjava.io高效读取文本
BufferedWriterjava.io高效写入文本
FileReaderjava.io读取字符文件
FileWriterjava.io写入字符文件
FileInputStreamjava.io读取字节文件
FileOutputStreamjava.io写入字节文件
Filesjava.nio.file文件操作工具类

如果你正在准备一篇面向初学者或团队成员的技术博客,这篇内容将帮助他们快速理解 Java 中的输入输出机制,并能立即上手实践。

欢迎点赞、收藏、转发,也欢迎留言交流你在实际开发中遇到的IO相关问题,我们下期再见 👋

📌 关注我,获取更多Java核心技术深度解析!