如何可以肯定的一个文件已被成功写入
答案:1 悬赏:50 手机版
解决时间 2021-03-15 14:53
- 提问者网友:眉目添风霜
- 2021-03-15 09:13
如何可以肯定的一个文件已被成功写入
最佳答案
- 五星知识达人网友:爱难随人意
- 2021-03-15 09:21
我添加的自动保存函数,在Java中的图形应用程序。该应用程序会定期的的AutoSave电流,也对的AutoSave退出。当启动应用程序时,自动保存文件重新加载。
如果自动保存文件已损坏以任何方式(我当文件在被保存的中间停电会这么做吗?),将失去他们的工作。我怎样才能防止这种情况,并尽我所能,以保证自动保存是处于一致的状态?
要事项 CodeGo.net,自动保存在我需要保存的。xml文件和几个。png文件。此外,。png格式保存在发生了JNI的C代码。
我现在的策略是每个写,扩展名为PNG格式。带有扩展名写的。xml文件。然后将每个文件来删除的。tmp部分离开的。xml,直到最后。在启动时,我只加载了自动保存,如果我能找到一个。xml文件,并忽略。文件。我也不要删除自动保存,直到。文件为新的
我想我的,当你写入到磁盘发生了什么知识较差。我知道你可以有软件读/写缓存文件,以及操作系统和硬件缓冲区,并且所有的这些都需要我,我可以怎么知道肯定的时候真的已被写入到磁盘上,我能做些什么来保护我自己。是否重命名操作做任何事情,以确保缓冲区
1. 如果自动保存文件已损坏以任何方式(我当文件在被保存的中间停电会这么做吗?),将失去他们的工作。我怎样才能防止这种情况,并尽我所能,以保证自动保存是处于一致的状态?
为了防止数据丢失,由于部分写入自动保存文件,不覆盖的自动保存文件。相反,写每一个新文件 CodeGo.net,然后将其一旦该文件已经被安全地写入。
为了防止没有注意到,一个自动保存文件没有被正确写入:
注意抛出的自动保存文件的异常是写在盒中的盘错误,文件系统已满,等收
保持,因为它是写文件的校验和运行,并在文件末尾写。然后,当你加载自动保存文件,检查校验和是存在的,是正确的。
如果检查点状态,涉及多个文件,确保您在写一个众所周知的顺序文件(而不覆盖!),并经过所有其他文件都被安全地关闭写上自动保存文件的校验和。你可能希望创建的每个检查点的目录。
FOLLOW UP
不,我不是说永远不过,它是atomicity-它要么(或文件系统没有改变,所以,如果你这样做:
写“file.new”和关闭,
删除“文件”,
“file.new”到“文件”
那么只要你保证有最新的“文件”安全上盘的优先步。它是简单的添加了几个步骤,让你有“文件”备份所有(如果第三步失败,你只剩下“file.new”,并没有“文件”,这可以手动恢复,或由应用程序自动下次你运行它。)
另外,我不是说永远写入或应用程序不会崩溃,或者说,权力永远不会熄灭。和校验的要点是允许您检测而这些事情已经发生了,并自动保存文件的情况下,
最后,它是有两个中的AutoSave如果您的应用程序获取自己变成一个状态,它的数据结构了,最后自动保存是没有意义的,结果是个好主意。 (校验将不能防止这一点。)约自动保存在应用程序崩溃的原因。
2.
顺便说一句,既然你有几个不同的文件,因为这一个哪一项目目录的一部分,以保持它们放在一起,封装格式(如。ZIP),把它们放在里面的一个文件。
你想要做什么是atomicity以新的取代旧的备份文件。不幸的是,我不认为Java的直接给你足够的控制做到这一点。你还需要理智什么操作都是
atomicity的底层操作系统。我知道,Linux文件系统,所以我的答案会向在该系统上运行的Java程序失之偏颇。我会很震惊,如果
Windows没有做的事,但我不能肯定地说。
大多数Linux文件系统(例如日志式的)让你以atomicity文件。如果系统崩溃,中途经过,当你重新启动,这将是,如果你从来没有摆在首位的文
件。出于这个原因,方式,atomicity更新现有的文件F是写新的数据到一个临时文件T和那么T到F的任何系统或应用程序崩溃最多不会影响楼所以它永
远是一致的。
当然,在你需要确保你的临时文件是一致的。确保所有的流缓冲区的文件是操作系统(Channel.force()或OutputStream.flush())和OS缓冲区到磁盘(FileOutputStream.getFD.sync())。
当然,除非你的操作系统禁用硬盘本身的写入缓存(它可能还没有),还是有机会,你的数据可以被损坏。添加校验到XML,如果你真的想成为真正确定。如果你
是真正的偏执狂,你应该在操作系统和硬盘缓冲区高速缓存和重新读取该文件以验证它是否是一致的。这是超越任何合理的预期的正常应用。
但是,这只是以atomicity写写入一个文件。您propblem是你有很多文件要更新atomicity。例如,我会说,你有两个文
件,img.png和main.xml文件。我会做下列操作之一:
最简单的解决方案是使每个SAVEFILE目录。你就不需要担心重命名每个单独的文件,你仍然可以以atomicity的新的备份目录覆盖旧的备份目录你
更换。也就是说,如果你的旧备份BAK / img.png和BAK / main.xml中,写和和窥知。
新辅助其他文件,并让他们与旧的一小会儿共存。也就是说,写img.2.png和主。
(这应该是指img.2.png,不img.png),只有主。到main.xml中。然后删除img.png。
另外:如果你没有atomicity弹#2上退而求其次延伸。每当您保存项目,给它一个新的(例如ver342.xml)。当您加载,只要找到最近的
XML中是一致的(即其校验和核实)。保持大约2或3是安全的。只能删除,如果你已经从一个更近的副本恢复自动保存。
如果自动保存文件已损坏以任何方式(我当文件在被保存的中间停电会这么做吗?),将失去他们的工作。我怎样才能防止这种情况,并尽我所能,以保证自动保存是处于一致的状态?
要事项 CodeGo.net,自动保存在我需要保存的。xml文件和几个。png文件。此外,。png格式保存在发生了JNI的C代码。
我现在的策略是每个写,扩展名为PNG格式。带有扩展名写的。xml文件。然后将每个文件来删除的。tmp部分离开的。xml,直到最后。在启动时,我只加载了自动保存,如果我能找到一个。xml文件,并忽略。文件。我也不要删除自动保存,直到。文件为新的
我想我的,当你写入到磁盘发生了什么知识较差。我知道你可以有软件读/写缓存文件,以及操作系统和硬件缓冲区,并且所有的这些都需要我,我可以怎么知道肯定的时候真的已被写入到磁盘上,我能做些什么来保护我自己。是否重命名操作做任何事情,以确保缓冲区
1. 如果自动保存文件已损坏以任何方式(我当文件在被保存的中间停电会这么做吗?),将失去他们的工作。我怎样才能防止这种情况,并尽我所能,以保证自动保存是处于一致的状态?
为了防止数据丢失,由于部分写入自动保存文件,不覆盖的自动保存文件。相反,写每一个新文件 CodeGo.net,然后将其一旦该文件已经被安全地写入。
为了防止没有注意到,一个自动保存文件没有被正确写入:
注意抛出的自动保存文件的异常是写在盒中的盘错误,文件系统已满,等收
保持,因为它是写文件的校验和运行,并在文件末尾写。然后,当你加载自动保存文件,检查校验和是存在的,是正确的。
如果检查点状态,涉及多个文件,确保您在写一个众所周知的顺序文件(而不覆盖!),并经过所有其他文件都被安全地关闭写上自动保存文件的校验和。你可能希望创建的每个检查点的目录。
FOLLOW UP
不,我不是说永远不过,它是atomicity-它要么(或文件系统没有改变,所以,如果你这样做:
写“file.new”和关闭,
删除“文件”,
“file.new”到“文件”
那么只要你保证有最新的“文件”安全上盘的优先步。它是简单的添加了几个步骤,让你有“文件”备份所有(如果第三步失败,你只剩下“file.new”,并没有“文件”,这可以手动恢复,或由应用程序自动下次你运行它。)
另外,我不是说永远写入或应用程序不会崩溃,或者说,权力永远不会熄灭。和校验的要点是允许您检测而这些事情已经发生了,并自动保存文件的情况下,
最后,它是有两个中的AutoSave如果您的应用程序获取自己变成一个状态,它的数据结构了,最后自动保存是没有意义的,结果是个好主意。 (校验将不能防止这一点。)约自动保存在应用程序崩溃的原因。
2.
顺便说一句,既然你有几个不同的文件,因为这一个哪一项目目录的一部分,以保持它们放在一起,封装格式(如。ZIP),把它们放在里面的一个文件。
你想要做什么是atomicity以新的取代旧的备份文件。不幸的是,我不认为Java的直接给你足够的控制做到这一点。你还需要理智什么操作都是
atomicity的底层操作系统。我知道,Linux文件系统,所以我的答案会向在该系统上运行的Java程序失之偏颇。我会很震惊,如果
Windows没有做的事,但我不能肯定地说。
大多数Linux文件系统(例如日志式的)让你以atomicity文件。如果系统崩溃,中途经过,当你重新启动,这将是,如果你从来没有摆在首位的文
件。出于这个原因,方式,atomicity更新现有的文件F是写新的数据到一个临时文件T和那么T到F的任何系统或应用程序崩溃最多不会影响楼所以它永
远是一致的。
当然,在你需要确保你的临时文件是一致的。确保所有的流缓冲区的文件是操作系统(Channel.force()或OutputStream.flush())和OS缓冲区到磁盘(FileOutputStream.getFD.sync())。
当然,除非你的操作系统禁用硬盘本身的写入缓存(它可能还没有),还是有机会,你的数据可以被损坏。添加校验到XML,如果你真的想成为真正确定。如果你
是真正的偏执狂,你应该在操作系统和硬盘缓冲区高速缓存和重新读取该文件以验证它是否是一致的。这是超越任何合理的预期的正常应用。
但是,这只是以atomicity写写入一个文件。您propblem是你有很多文件要更新atomicity。例如,我会说,你有两个文
件,img.png和main.xml文件。我会做下列操作之一:
最简单的解决方案是使每个SAVEFILE目录。你就不需要担心重命名每个单独的文件,你仍然可以以atomicity的新的备份目录覆盖旧的备份目录你
更换。也就是说,如果你的旧备份BAK / img.png和BAK / main.xml中,写和和窥知。
新辅助其他文件,并让他们与旧的一小会儿共存。也就是说,写img.2.png和主。
(这应该是指img.2.png,不img.png),只有主。到main.xml中。然后删除img.png。
另外:如果你没有atomicity弹#2上退而求其次延伸。每当您保存项目,给它一个新的(例如ver342.xml)。当您加载,只要找到最近的
XML中是一致的(即其校验和核实)。保持大约2或3是安全的。只能删除,如果你已经从一个更近的副本恢复自动保存。
我要举报
如以上回答内容为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
点此我要举报以上问答信息
大家都在看
推荐资讯