繁体   English   中英

如何同时写和读文件

[英]How to write and read to file reactively in the same time

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

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

为了读取文件,我使用com.fasterxml.jackson.core.JsonParser

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

用Java做到的方式?

我的业务场景:

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

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

在第二个步骤,我想写child record ,但我需要遍历record relations file (阅读开放写入描述符文件操作),我需要找到找到parent record我的child record和更新父记录时,我填child structure ,其中插入child_1 element示例结构,我现在正在使用:

{
"parent_1": {
...
childs: [{
"child_1": { ... } 
}]
}
}

您对问题的描述不是很清楚,我们不知道您为什么要这样做以及您想要实现什么 但我会尝试:

如果您尝试像JavaScript中的React.js一样执行操作,则需要程序监视文件是否已更改,并通过更新相应的对象来对此做出反应 但这不是很有效(也没有多大意义)-也许仅在对象类中使用静态字段来维护实例之间的状态就可以解决问题? 如果这完全适用于您的情况...

我将使用文件的修改时间(或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() ,但对于随机访问的文件,文件通道(尤其是带有缓冲区的文件FileLock.lock() ,则更多。 例如,如果json文件确实很大。 但是,json格式本身并不足够。

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM