如何同时写和读文件

时间:2019-01-24 15:24:25

标签: java

有人知道在Java中读写文件(xml,json)的方法,其中 Java对象将能够以反应方式存储在文件中。

我现在使用 com.fasterxml.jackson.core.JsonGenerator将对象写入json文件。

要读取我正在使用的文件 com.fasterxml.jackson.core.JsonParser

但是我无法同时读写文件。 我不想有很多打开/关闭文件描述符的操作。

这是用Java实现的方法吗?

我的业务情景:

我从一个大文件(然后是几个GB)中读取记录,并且需要在记录之间创建关系。 不幸的是,输入文件中的记录不会进行排序,并且当所有记录都处于完美顺序时,就无法写入排序文件。

我遍历输入文件并找到parent record,并希望在创建记录之间的记录时将记录写入第二个文件。

第二步,我想写child record,但是我需要遍历record relations file(使用开放写描述符的读文件操作),并且需要为我的{{ 1}},并在我填写parent record并在其中插入我现在使用的child record示例结构时更新该父记录:

child structure

3 个答案:

答案 0 :(得分:0)

对问题的描述不是很清楚,我们不知道为什么为什么以及要实现的目标。但我会尝试:

如果您尝试执行类似React.js的JavaScript那样的操作,则需要程序来监视文件是否已更改,并通过更新相应的对象来反应。但这不是很有效(也没有什么意义)-也许只在对象类中使用静态字段来维持实例之间的状态就可以了?如果这完全适用于您的情况...

答案 1 :(得分:0)

我将使用文件的修改时间(或json中的运行版本号/ UUID)完整地加载和保存文件。

对于多个文件,可能对同一文件的多次访问需要一个管理类。

Files类可用于加载/保存。

Path path = Paths.get("...");
FileTime t = Files.getLastModified(path);
byte[] data = Files.readAllBytes(path);
FileTime tcheck = Files.getLastModified(path);
ByteArrayInputStream bais = ...

通过这种方式,访问尽可能地是原子/瞬时的。

理想情况下,您可以使用FileLock.lock(),但对于随机访问文件来说更多, 文件通道,尤其是带有缓冲区的通道。例如,如果json文件确实很大。 但是,那么json格式本身就不够用。

答案 2 :(得分:0)

我认为针对我的案件的最佳解决方案是:

  • 读取父记录并为他查找所有子记录(存储在内存中)及之后 到达文件末尾,将我的父记录+子记录刷新到relations_file
  • 使用读写通道的最佳方法是使用FileChannel