【JavaEE初阶】告别小白!Java IO 流读写 + 文件操作实战
Java IO 是 JavaEE 开发的基础核心,掌握它就能轻松处理文件读写、网络数据传输等操作。本指南针对初学者,从零开始讲解 File 类文件操作 和 IO 流读写,重点结合实战示例,帮助你快速上手。基于 Java 8+ 版本,所有代码示例均可直接运行。
为了直观理解,我们先来看 Java IO 流的类层次结构图:
1. File 类:文件和目录操作基础
java.io.File 类用于表示文件或目录的路径,可以进行创建、删除、重命名、判断等操作(不涉及文件内容读写)。
常用方法
createNewFile():创建新文件mkdir()/mkdirs():创建目录(mkdirs 可递归创建)delete():删除文件或空目录exists():判断是否存在isFile()/isDirectory():判断是文件还是目录listFiles():列出目录下所有文件
实战示例:创建目录、文件并遍历
import java.io.File;
import java.io.IOException;
public class FileDemo {
public static void main(String[] args) throws IOException {
// 创建 File 对象(路径可相对或绝对)
File dir = new File("test/dir/subdir");
if (!dir.exists()) {
dir.mkdirs(); // 递归创建目录
System.out.println("目录创建成功: " + dir.getAbsolutePath());
}
File file = new File(dir, "hello.txt");
if (file.createNewFile()) {
System.out.println("文件创建成功: " + file.getAbsolutePath());
}
// 遍历目录
File[] files = dir.getParentFile().listFiles();
if (files != null) {
for (File f : files) {
System.out.println((f.isDirectory() ? "目录: " : "文件: ") + f.getName());
}
}
// 删除测试文件和目录(注释掉以保留)
// file.delete();
// dir.delete();
}
}
运行结果示例:
目录创建成功: /path/to/test/dir/subdir
文件创建成功: /path/to/test/dir/subdir/hello.txt
…(列出文件)
2. IO 流基础:字节流 vs 字符流
- 字节流(InputStream/OutputStream):处理所有类型文件(文本、图片、视频),以字节为单位。适合二进制数据。
- 字符流(Reader/Writer):专门处理文本文件,以字符为单位(自动处理编码)。不适合非文本文件。
推荐:文本文件用字符流 + 缓冲流;非文本用字节流 + 缓冲流。
3. 字节流实战:文件复制(适合任意文件,如图片)
基本字节流(FileInputStream / FileOutputStream)
import java.io.*;
public class ByteCopy {
public static void main(String[] args) throws IOException {
File src = new File("src.jpg"); // 源文件(图片)
File dest = new File("dest.jpg"); // 目标文件
try (InputStream is = new FileInputStream(src);
OutputStream os = new FileOutputStream(dest)) {
byte[] buffer = new byte[1024]; // 缓冲数组,提高效率
int len;
while ((len = is.read(buffer)) != -1) {
os.write(buffer, 0, len);
}
}
System.out.println("字节流复制完成!");
}
}
缓冲字节流(高效推荐)
import java.io.*;
public class BufferedByteCopy {
public static void main(String[] args) throws IOException {
File src = new File("src.jpg");
File dest = new File("dest_buffered.jpg");
try (BufferedInputStream bis = new BufferedInputStream(new FileInputStream(src));
BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(dest))) {
byte[] buffer = new byte[1024];
int len;
while ((len = bis.read(buffer)) != -1) {
bos.write(buffer, 0, len);
}
}
System.out.println("缓冲字节流复制完成(更快)!");
}
}
4. 字符流实战:文本文件读写(推荐 BufferedReader/Writer)
基本字符流(FileReader / FileWriter)
import java.io.*;
public class CharReadWrite {
public static void main(String[] args) throws IOException {
try (Reader reader = new FileReader("input.txt");
Writer writer = new FileWriter("output.txt")) {
char[] buffer = new char[1024];
int len;
while ((len = reader.read(buffer)) != -1) {
writer.write(buffer, 0, len);
}
}
System.out.println("字符流复制文本完成!");
}
}
缓冲字符流(高效 + 按行读取,强烈推荐)
import java.io.*;
public class BufferedCharDemo {
public static void main(String[] args) throws IOException {
try (BufferedReader br = new BufferedReader(new FileReader("input.txt"));
BufferedWriter bw = new BufferedWriter(new FileWriter("output_buffered.txt"))) {
String line;
while ((line = br.readLine()) != null) {
bw.write(line);
bw.newLine(); // 换行
}
}
System.out.println("缓冲字符流按行复制完成(最常用)!");
}
}
注意:字符流适合纯文本,避免乱码。写入后记得 flush() 或关闭流。
5. 最佳实践与注意事项
- 始终使用 try-with-resources:自动关闭流,避免资源泄漏。
- 缓冲流优先:大幅提升性能(减少磁盘 IO)。
- 异常处理:IO 操作必抛 IOException。
- Java 7+ NIO 简介:对于高并发,推荐
java.nio(非阻塞、通道+缓冲区),但初阶先掌握传统 IO。 - 常见错误:忘记关闭流、用字符流复制图片导致损坏。
总结与进阶
通过这些实战,你已掌握 Java IO 的核心:File 操作 + 字节/字符流读写 + 文件复制。练习建议:实现一个“文件拷贝工具”支持拖拽路径。
进一步学习:序列化(ObjectInput/OutputStream)、NIO.2(Paths/Files)、网络 IO(Socket)。
多敲代码,实战出真知!如果需要更多示例(如递归遍历目录、异常日志),随时提问。加油,告别小白!🚀