【本地持久化到磁盘的模式】
文章目录
- row模式
- BufferWriter模式
- BufferWriter最常见的模式
- 按行高效的写文件
- 写二进制文件
- 利用 Files.write() 一次性写入小文件
- 带缓冲的 OutputStream 写二进制
- RocksDB 模式
- 代码实现:
- 批量写入
- 写入的参数优化
row模式
BufferWriter模式
BufferWriter最常见的模式
适合写入txt、csv等文件格式内容,常用到我们的快照,数据保存到磁盘等模式。
特点:适合数据量小,快速实现的业务方法,另外还可以覆盖写,或者追加写,内容再文件上清晰可见,不需要额外的操作就可以直接观察大文件内容。
最简便的写入:
import java.io.*;public class WriteFileExample {public static void main(String[] args) {String filePath = "/tmp/demo.txt";BufferedWriter writer=nulltry ( writer= new BufferedWriter(new FileWriter(filePath))) {writer.write("第一行内容");writer.newLine(); // 换行writer.write("第二行内容");System.out.println("写入完成");} catch (IOException e) {e.printStackTrace();}finally{if(writer != null){//关闭缓冲区writer.close();}}}
}
按行高效的写文件
如果你要写入几百万行,推荐使用 Files.newBufferedWriter(NIO方式)。
特点:NIO 实现,性能更优;
StandardOpenOption 可控制行为(CREATE、APPEND、TRUNCATE_EXISTING)。
import java.io.*;
import java.nio.file.*;
import java.nio.charset.StandardCharsets;public class NioWriteDemo {public static void main(String[] args) throws IOException {Path path = Paths.get("/tmp/bigdata.txt");try (BufferedWriter writer = Files.newBufferedWriter(path, StandardCharsets.UTF_8,StandardOpenOption.CREATE,StandardOpenOption.TRUNCATE_EXISTING)) {for (int i = 0; i < 1_000_000; i++) {writer.write("第" + i + "行数据");writer.newLine();}}}
}
写二进制文件
使用FileOutputStream,可用于写图片、序列化数据、网络流保存。
import java.io.*;public class BinaryWriteExample {public static void main(String[] args) {byte[] data = {65, 66, 67}; // ABCtry (FileOutputStream fos = new FileOutputStream("/tmp/data.bin")) {fos.write(data);fos.flush();} catch (IOException e) {e.printStackTrace();}}
}
利用 Files.write() 一次性写入小文件
适合快速写小文件,文件的大小一般小于10M
import java.nio.file.*;
import java.util.*;
import java.nio.charset.StandardCharsets;public class SimpleWrite {public static void main(String[] args) throws Exception {Path path = Paths.get("/tmp/simple.txt");List<String> lines = Arrays.asList("第一行", "第二行", "第三行");Files.write(path, lines, StandardCharsets.UTF_8);}
}
带缓冲的 OutputStream 写二进制
适合流式导出 Excel、CSV、数据备份等。
import java.io.*;public class BufferedStreamWrite {public static void main(String[] args) {try (BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream("/tmp/buffered.bin"))) {for (int i = 0; i < 1000; i++) {bos.write(("line-" + i + "\n").getBytes());}bos.flush();} catch (IOException e) {e.printStackTrace();}}
}
RocksDB 模式
介绍:RocksDB 基于磁盘的高性能 Key-Value 存储引擎,它是 LevelDB 的增强版。所有数据最终都落在磁盘上,并通过 LSM-Tree(Log-Structured Merge Tree) 管理。
特点:适合高写入、高压缩场景(比如 Nacos、TiKV、Flink StateBackend 等都用它)。
代码实现:
maven依赖:
<dependency><groupId>org.rocksdb</groupId><artifactId>rocksdbjni</artifactId><version>9.4.0</version>
</dependency>
代码实现:
import org.rocksdb.*;public class RocksDBWriteDemo {static {RocksDB.loadLibrary(); // 加载 RocksDB 本地库}public static void main(String[] args) {String dbPath = "/tmp/rocksdb-demo";try (final Options options = new Options().setCreateIfMissing(true);final RocksDB db = RocksDB.open(options, dbPath)) {// 写入数据(写磁盘)db.put("name".getBytes(), "zhangqin".getBytes());db.put("age".getBytes(), "28".getBytes());// 获取数据System.out.println(new String(db.get("name".getBytes())));// 删除数据db.delete("age".getBytes());System.out.println("写入 RocksDB 成功,数据已落盘:" + dbPath);} catch (RocksDBException e) {e.printStackTrace();}}
}
生成的文件:

批量写入
一次批量写入可以合并成一个磁盘操作,性能显著提升。
try (final Options options = new Options().setCreateIfMissing(true);final RocksDB db = RocksDB.open(options, "/tmp/rocksdb-batch")) {try (final WriteBatch batch = new WriteBatch()) {batch.put("user1".getBytes(), "A".getBytes());batch.put("user2".getBytes(), "B".getBytes());batch.put("user3".getBytes(), "C".getBytes());db.write(new WriteOptions(), batch);}
}
写入的参数优化
Options options = new Options();
options.setCreateIfMissing(true);// 内存表大小(默认 64MB)
options.setWriteBufferSize(128 * 1024 * 1024);// 压缩算法(默认 Snappy,可改成 ZSTD/LZ4)
options.setCompressionType(CompressionType.LZ4_COMPRESSION);// 并发度
options.setMaxBackgroundFlushes(2);
options.setMaxBackgroundCompactions(4);