Java 存储与读取数据方案 —— File I/O 篇
摘要:Java文件I/O操作分为传统I/O和NIO两种方式。传统I/O通过流实现,包括处理二进制数据的字节流(InputStream/OutputStream)、处理文本的字符流(Reader/Writer),以及提升性能的缓冲流(BufferedXxx)。NIO采用缓冲区+通道模式,适合高性能和大文件操作。关键类包括File(文件管理)、数据流(DataInputStream/DataOutpu
1. 核心概念
Java 的文件存储与读取主要分为两类:
-
基于流(Stream)的 I/O(传统 I/O)
-
字节流(
InputStream
/OutputStream
):处理二进制数据(图片、音视频等) -
字符流(
Reader
/Writer
):处理文本数据(自动按字符编码解码) -
缓冲流(
BufferedXxx
):提升性能 -
数据流 / 对象流(
DataInputStream
/ObjectInputStream
):读写基本类型和对象
-
-
基于 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(Files 、Channel ) |
存储基本类型 | DataOutputStream / DataInputStream |
存储对象 | ObjectOutputStream / ObjectInputStream |
更多推荐
所有评论(0)