如何将行写入文件,并且每一行都是一个原子操作?

发布于 2024-12-10 11:53:30 字数 341 浏览 0 评论 0原文

我想向文件写入一些行,并且我需要每一行写入都是一个原子操作。

例如,我有3行:

111111111111111111111111
222222222222222222222222
333333333333333333333333

当我将它们逐行写入文件时,程序可能会错误退出,因此保存的数据可能是:

11111111111111111111111
222222

这不是我所期望的。我希望每一行都是一个事务,一个原子操作。

我该怎么做?


目前我使用 Java 来做到这一点。

I want to write some lines to a file, and I need each line of writing is a atomic operation.

For example, I have 3 lines:

111111111111111111111111
222222222222222222222222
333333333333333333333333

When I write them into a file line by line, the program may be exit by error, so the saved data may be:

11111111111111111111111
222222

This is not what I expected. I hope each line is a transaction, a atomic operation.

How should I do this?


Currently I use Java to do this.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

筱果果 2024-12-17 11:53:30

没有 100% 可靠的方法可以保证这一点。

我认为您可以获得的最接近的是通过调用 flush() 在输出流上,然后 sync() 在底层文件描述符上。同样,在某些故障模式下这也无济于事。

There isn't a 100% reliable way to guarantee this.

I think the closest you can get is by calling flush() on the output stream and then sync() on the underlying file descriptor. Again, there are failure modes where this won't help.

你在看孤独的风景 2024-12-17 11:53:30

如果您确实需要将新行原子写入文件,我想唯一的方法是使用新名称创建副本,写入新行并将新文件重命名为原始名称。重命名操作是原子的,至少在 POSIX 下是这样。在Windows上,重命名之前需要删除原始文件,这会带来如果过程中出现问题无法恢复文件的问题。

If you really need atomic writing of new lines to a file, I guess the only way is to create a copy under a new name, write the new line and rename the new file to the original name. The rename operation is atomic, at least under POSIX. On Windows you would need to remove the original file before renaming, which bears the problem of not being able to restore the file if a problem occurs in the that process.

小嗲 2024-12-17 11:53:30

您可以按照@aix 的建议使用flush/sync。否则(更好 - 99.999% 可靠)是使用某种包含事务支持的环境(例如数据库)并使用commit

You can use flush/sync as @aix suggests. Otherwise (and better -- 99.999% reliable) is to use some sort of environment (such as a database) that includes transaction support and use commit.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文