当前位置: 首页 > news >正文

【本地持久化到磁盘的模式】

文章目录

  • 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);
http://www.dtcms.com/a/589721.html

相关文章:

  • 土巴兔网站开发技术软件开发的七个流程
  • 给公司做网站软件网站备案点不进去
  • 11、Linux 文本流处理命令
  • 微信网站建设方案ppt湖北省住房和城乡建设网站
  • Linux复习:进程状态与环境变量深度解析:孤儿、僵尸进程与程序启动探究
  • JVM(二)------ 类加载、初始化与单例模式的联系
  • 做【秒开】的程序:WPF / WinForm / WinUI3 / Electron
  • 小白零基础教程:安装 Conda + VSCode 配置 Python 开发环境
  • Word技巧:制作可勾选的复选框并自定义选中符号
  • 做彩票网站违法吗最专业的做网站公司
  • 淘宝刷单网站建设未来做哪个网站致富
  • php婚庆网站贵州建设官方网站
  • 将你的旧手机变成监控摄像头(Python + OpenCV)
  • 推广网站2024网络策划专员
  • 如何利用模板建站增城网站公司电话
  • week9
  • 网站上线除了备案还需要什么扬州广陵区城乡建设局网站
  • 原生CSS讲解
  • Lit.js 入门介绍:与 React 的对比
  • 【Gateway】服务调用和网关配置攻略
  • 万网域名注册后怎么样做网站做网站必须原创吗
  • 青岛企业网站建设wordpress乱码
  • 《Redis应用实例》Java实现(27):定长队列和淘汰队列
  • 做网站服务器怎么用怎样创建行业门户网站
  • net core开发跨平台的桌面应用,如上位机很实用
  • python+playwright:如何解决某个页面不稳定的出现不影响ui自动化执行
  • Redis 使用场景
  • 针对动态连接场景的验证环境搭建思路
  • 网页制作与网站建设答案专业建设汇报ppt
  • 机器学习21:可解释机器学习(Explainable Machine Learning)(上)