有时您需要将大量数据导出到JSON到文件中。 可能是“将所有数据导出到JSON”,或者是GDPR“可移植性权利”,您实际上需要这样做。

与任何大型数据集一样,您不能只将其全部容纳在内存中并将其写入文件。 它需要一段时间,它会从数据库中读取大量条目,并且您需要注意不要使此类导出使整个系统超载或耗尽内存。

幸运的是,借助Jackson的SequenceWriter和可选的管道流,这样做非常简单。 看起来像这样:

private ObjectMapper jsonMapper = new ObjectMapper();private ExecutorService executorService = Executors.newFixedThreadPool(5);@Asyncpublic ListenableFuture<Boolean> export(UUID customerId) {try (PipedInputStream in = new PipedInputStream();PipedOutputStream pipedOut = new PipedOutputStream(in);GZIPOutputStream out = new GZIPOutputStream(pipedOut)) {Stopwatch stopwatch = Stopwatch.createStarted();ObjectWriter writer = jsonMapper.writer().withDefaultPrettyPrinter();try(SequenceWriter sequenceWriter = writer.writeValues(out)) {sequenceWriter.init(true);Future<?> storageFuture = executorService.submit(() ->storageProvider.storeFile(getFilePath(customerId), in));int batchCounter = 0;while (true) {List<Record> batch = readDatabaseBatch(batchCounter++);for (Record record : batch) {sequenceWriter.write(entry);}}// wait for storing to completestorageFuture.get();}  logger.info("Exporting took {} seconds", stopwatch.stop().elapsed(TimeUnit.SECONDS));return AsyncResult.forValue(true);} catch (Exception ex) {logger.error("Failed to export data", ex);return AsyncResult.forValue(false);}}

该代码可以做一些事情:

  • 使用SequenceWriter连续写入记录。 它使用OutputStream初始化,所有内容均写入其中。 这可以是简单的FileOutputStream,也可以是如下所述的管道流。 注意,这里的命名有点误导– writeValues(out)听起来像是您指示作者现在写东西; 而是将其配置为以后使用特定的流。
  • SequenceWriter初始化为true ,表示“包装在数组中”。 您正在编写许多相同的记录,因此它们应在最终JSON中表示一个数组。
  • 使用PipedOutputStreamPipedInputStreamSequenceWriter链接到InputStream ,然后将InputStream传递到存储服务。 如果我们明确地处理文件,则不需要这样做-只需传递FileOutputStream就可以。 但是,您可能希望以不同的方式存储文件,例如在Amazon S3中,并且putObject调用需要一个InputStream,从该InputStream可以读取数据并将其存储在S3中。 因此,实际上,您正在写入一个OutputStream,而该OutputStream会直接写入InputStream,当被输入以读取该输入流时,会将所有内容写入另一个OutputStream
  • 存储文件是在单独的线程中调用的,因此写入文件不会阻塞当前线程,当前线程的目的是从数据库中读取数据。 同样,如果使用简单的FileOutputStream,则不需要这样做。
  • 整个方法被标记为@Async(spring),因此它不会阻止执行-它被调用并在准备就绪时完成(使用内部Spring executor服务和有限的线程池)
  • 这里未显示数据库批处理读取代码,因为它随数据库的不同而不同。 关键是,您应该分批提取数据,而不是SELECT * FROMX。
  • OutputStream包装在GZIPOutputStream中,因为带有重复元素的JSON之类的文本文件可从压缩中显着受益

主要工作是由Jackson的SequenceWriter完成的,(显而易见的)一点是–不要假设您的数据可以容纳在内存中。 它几乎永远不会做,所以批量处理和增量写入都是如此。

翻译自: https://www.javacodegeeks.com/2018/08/writing-big-json-files-jackson.html

用Jackson编写大型JSON文件相关推荐

  1. 用jackson转json_用Jackson编写大JSON文件

    用jackson转json 有时您需要将大量数据导出到JSON到文件中. 也许是"将所有数据导出到JSON",或者是GDPR"可移植性的权利",您实际上需要这样 ...

  2. android最大json,Android:解析大型JSON文件

    我正在创建一个Android应用程序,该应用程序应该将Json从文件或网址解析为jsonarray和jsonobjects. 问题是,我的JSON是3.3 MB,当我使用一个简单的代码,如下所示:(现 ...

  3. 迈克尔 杰克逊mv_用杰克逊流式传输大型JSON文件– RxJava常见问题解答

    迈克尔 杰克逊mv 在上一篇文章中,我们学习了如何解析过大的XML文件并将其转换为RxJava流. 这次让我们看一个大的JSON文件. 我们的示例将基于微小的colors.json,其中包含将近150 ...

  4. 用杰克逊流式传输大型JSON文件– RxJava常见问题解答

    在上一篇文章中,我们学习了如何解析过大的XML文件并将其转换为RxJava流. 这次让我们看一个大的JSON文件. 我们的示例将基于微小的colors.json,其中包含将近150种这种格式的记录: ...

  5. jackson Read 读取 json 文件和 Write 写入 json 文件 读写 json 文件

    jackson Read Write 读取 json 文件和写入 json 文件 jackson 可以由这里获得 http://repo1.maven.org/maven2/com/fasterxml ...

  6. 查看在Ubuntu上打印的大型JSON文件

    众所周知,在Ubuntu系统如果json文件内存大于一定的MB之后,直接打开json文件会很卡而且乱码,所以要怎么打开才不会乱码呢?且听我慢慢道来. 打开终端,输入:cat myjsonfile.js ...

  7. 大型json文件格式化【超简单】

    问题 遇到了一个很大的JSON文件(约4M),想格式化查看,在线json工具会直接崩溃,网上其他同学说的python方法之类的我也都实验失败,但是发现了vs code中一个超强的代码格式化 解决1(2 ...

  8. java逐行读取文件数组_快速高效地在Java中逐行读取大型JSON文件的方法

    您可以使用 JSON Processing API (JSR 353)以流式方式处理数据: import javax.json.Json; import javax.json.stream.JsonP ...

  9. 基于流式输入输出 使用Java借助GSON库 实现对大型asc文件的读入解析 并输出为JSON文件

    基于流式输入输出 使用Java借助GSON库 实现对大型asc文件的读入解析 并输出为JSON文件 致谢 1 为什么要使用流式输入输出(使用情景) 2 目标.主要思路及相关方法 2.1 目标 2.2 ...

最新文章

  1. Android Studio 简介
  2. 让echo解析反斜杠
  3. 黑马程序员.bobo.DAY.2
  4. 密歇根州立大学联合字节提出AutoEmb用于流式推荐
  5. 老板,年终奖我不要了,请给我一部华为Mate RS保时捷设计手机
  6. python亲和性分析法推荐电影论文_关于《Python数据挖掘入门与实战》读书笔记二(亲和性分析)...
  7. 前端实现炫酷动效_20个网页动效设计的炫酷神器
  8. 洛谷 深基 第1部分 语言入门 第2章 顺序结构程序设计
  9. 【NetWebApi】接口参数传递笔记
  10. jquery.form.js ajax提交上传文件
  11. Spring @Service批注
  12. 一道和逆向和溢出有关的竞赛题分析
  13. 【会议记录】0305
  14. w ndows摄像头驱动怎么安,电脑中如何安装摄像头驱动
  15. Hive Privilege 分析
  16. J2ME,与你有缘无分。
  17. 计算机学院毕业典礼口号,大学毕业典礼横幅标语大全
  18. 最简单最明白的关于“事件”和“委托”的例子说明
  19. 网络安全-靶机dvwa之sql注入Low到High详解(含代码分析)
  20. Linux系统中如何查找大文件或目录文件夹的方法

热门文章

  1. Sentinel(二十三)之使用Apollo存储规则
  2. 汇编语言(三十二)之读写文件
  3. 【JVM】浅谈双亲委派和破坏双亲委派
  4. Java IO: FileOutputStream
  5. Java IO: 流
  6. JVM调优总结(1):一些概念
  7. Oracle入门(十四F)之PL/SQL定义变量
  8. spring boot使用注解的方式整合mybaits
  9. C/C++输入输出流
  10. springboot+layui从控制器请求至页面时js失效的解决方法