1. 核心概念

Java 的文件存储与读取主要分为两类:

  1. 基于流(Stream)的 I/O(传统 I/O)

    • 字节流InputStream / OutputStream):处理二进制数据(图片、音视频等)

    • 字符流Reader / Writer):处理文本数据(自动按字符编码解码)

    • 缓冲流BufferedXxx):提升性能

    • 数据流 / 对象流DataInputStream / ObjectInputStream):读写基本类型和对象

  2. 基于 NIO 的 I/O(New I/O)

    • 面向缓冲区(Buffer)+ 通道(Channel)+ 选择器(Selector

    • 适合高性能、大文件、并发文件操作


2. 文件对象管理(java.io.File

File 只是一个路径抽象,不负责直接读写数据。

import java.io.File;

public class FileDemo {
    public static void main(String[] args) {
        File file = new File("test.txt");

        System.out.println("是否存在: " + file.exists());
        System.out.println("绝对路径: " + file.getAbsolutePath());
        System.out.println("是否文件: " + file.isFile());
        System.out.println("是否目录: " + file.isDirectory());

        // 创建文件
        if (!file.exists()) {
            try {
                file.createNewFile();
                System.out.println("文件创建成功");
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }
}

3. 字节流(处理二进制数据)

写入

import java.io.FileOutputStream;

public class ByteWriteDemo {
    public static void main(String[] args) throws Exception {
        try (FileOutputStream fos = new FileOutputStream("data.bin")) {
            fos.write(new byte[]{65, 66, 67}); // 写入 ABC
        }
    }
}

读取

import java.io.FileInputStream;

public class ByteReadDemo {
    public static void main(String[] args) throws Exception {
        try (FileInputStream fis = new FileInputStream("data.bin")) {
            int b;
            while ((b = fis.read()) != -1) {
                System.out.print((char) b);
            }
        }
    }
}


4. 字符流(处理文本数据)

字符流会按指定编码(默认 UTF-8)进行读写。

写入

import java.io.FileWriter;

public class CharWriteDemo {
    public static void main(String[] args) throws Exception {
        try (FileWriter fw = new FileWriter("text.txt")) {
            fw.write("Hello, 世界");
        }
    }
}

读取

import java.io.FileReader;

public class CharReadDemo {
    public static void main(String[] args) throws Exception {
        try (FileReader fr = new FileReader("text.txt")) {
            int ch;
            while ((ch = fr.read()) != -1) {
                System.out.print((char) ch);
            }
        }
    }
}


5. 缓冲流(提升性能)

BufferedInputStream / BufferedOutputStream(字节)
BufferedReader / BufferedWriter(字符)

import java.io.*;

public class BufferedDemo {
    public static void main(String[] args) throws Exception {
        try (BufferedReader br = new BufferedReader(new FileReader("text.txt"))) {
            String line;
            while ((line = br.readLine()) != null) {
                System.out.println(line);
            }
        }
    }
}

6. 数据流(读写基本类型)

DataInputStream / DataOutputStream

import java.io.*;

public class DataStreamDemo {
    public static void main(String[] args) throws Exception {
        try (DataOutputStream dos = new DataOutputStream(new FileOutputStream("data.dat"))) {
            dos.writeInt(123);
            dos.writeDouble(3.14);
            dos.writeUTF("Hello");
        }

        try (DataInputStream dis = new DataInputStream(new FileInputStream("data.dat"))) {
            System.out.println(dis.readInt());
            System.out.println(dis.readDouble());
            System.out.println(dis.readUTF());
        }
    }
}

7. 对象流(序列化 / 反序列化对象)

ObjectOutputStream / ObjectInputStream

import java.io.*;

class Person implements Serializable {
    String name;
    int age;
    Person(String name, int age) {
        this.name = name; this.age = age;
    }
}

public class ObjectStreamDemo {
    public static void main(String[] args) throws Exception {
        // 序列化
        try (ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("person.obj"))) {
            oos.writeObject(new Person("Tom", 20));
        }
        // 反序列化
        try (ObjectInputStream ois = new ObjectInputStream(new FileInputStream("person.obj"))) {
            Person p = (Person) ois.readObject();
            System.out.println(p.name + ", " + p.age);
        }
    }
}

8. NIO 高性能文件操作

import java.nio.file.*;
import java.nio.charset.StandardCharsets;

public class NioDemo {
    public static void main(String[] args) throws Exception {
        Path path = Paths.get("nio.txt");

        // 写入
        Files.write(path, "Hello NIO".getBytes(StandardCharsets.UTF_8));

        // 读取
        String content = Files.readString(path, StandardCharsets.UTF_8);
        System.out.println(content);
    }
}

NIO 优势

  • 支持非阻塞模式

  • 内存映射文件(MappedByteBuffer

  • 更适合大文件与高并发场景


9. 方案选择建议

场景 推荐方案
小文本文件 BufferedReader / BufferedWriter
二进制文件(图片、音视频) BufferedInputStream / BufferedOutputStream
大文件、高性能 NIO(FilesChannel
存储基本类型 DataOutputStream / DataInputStream
存储对象 ObjectOutputStream / ObjectInputStream
Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐