原子文件写入操作(跨平台) - java

如何建立原子文件写入操作?该文件将由Java服务编写,并由python脚本读取。
对于记录,读取远大于写入。但是写操作是成批发生的,而且往往很长。文件大小为兆字节。

现在,我的方法是:

  • 将文件内容写入临时文件
    同一目录
  • 删除旧文件
  • 将临时文件重命名为旧文件名。
  • 这是正确的方法吗?如何避免出现删除旧文件而新文件名尚未重命名的情况?

    这些编程语言(python和java)是否提供锁定结构并避免这种情况的构造?

    参考方案

    AFAIK号

    原因是要使这种原子操作成为可能,必须以事务性文件系统的形式提供OS支持。主流操作系统都没有提供事务性文件系统。

    编辑-至少对于兼容POSIX的系统我是错的。如果目标名称已经存在,则POSIX rename系统调用将执行原子替换……如@janneb所指出。这应该足以自动执行OP的操作。

    但是,事实仍然是,Java File.renameTo()方法没有明确保证是原子的,因此它不能为OP问题提供跨平台的解决方案。

    编辑2 -使用Java 7,您可以将java.nio.file.Files.move(Path source, Path target, CopyOption... options)与copyOptions和ATOMIC_MOVE结合使用。如果(操作系统/文件系统)不支持此功能,则应获取异常。

    Java:从文件系统加载资源 - java

    我的项目设定我有以下项目设置:\program.jar \images\logo.png 在我的代码中,我使用相对URL "images/logo.png"引用图像。问题如果我在目录中使用以下命令运行此程序:c:\projects\program_dir\bin\>java -jar program.jar 然后一切正常,Java能…

    Java Scanner读取文件的奇怪行为 - java

    因此,在使用Scanner类从文件读取内容时,我遇到了一个有趣的问题。基本上,我试图从目录中读取解析应用程序生成的多个输出文件,以计算一些准确性指标。基本上,我的代码只是遍历目录中的每个文件,并使用扫描仪将其打开以处理内容。无论出于何种原因,扫描程序都不会读取其中的一些文件(所有UTF-8编码)。即使文件不是空的,scanner.hasNextLine()在…

    Java:正则表达式模式匹配器是否有大小限制? - java

    我的模式类似于OR:“word1 | word2 | word3”我大约有800个字。可能有问题吗? 参考方案 您仅受记忆和理智的限制。 :)

    Java:找到特定字符并获取子字符串 - java

    我有一个字符串4.9.14_05_29_16_21,我只需要获取4.9。数字各不相同,所以我不能简单地获得此char数组的前三个元素。我必须找到最正确的.并将其子字符串化直到那里。我来自Python,因此我将展示Python的实现方法。def foobar(some_string): location = some_string.rfind('.&…

    Java:线程池如何将线程映射到可运行对象 - java

    试图绕过Java并发问题,并且很难理解线程池,线程以及它们正在执行的可运行“任务”之间的关系。如果我创建一个有10个线程的线程池,那么我是否必须将相同的任务传递给池中的每个线程,或者池化的线程实际上只是与任务无关的“工人无人机”可用于执行任何任务?无论哪种方式,Executor / ExecutorService如何将正确的任务分配给正确的线程? 参考方案 …