如何从Java应用程序中为操作系统上的所有其他进程锁定文件?

如何从Java应用程序中为操作系统上的所有其他进程锁定文件?,java,filestream,file-processing,Java,Filestream,File Processing,我有一个文件需要读几遍。我必须按顺序打开同一文件的InputStream。现在我想知道,只要Java应用程序的某个特定部分正在运行,是否可以对整个操作系统锁定该文件 我想防止3发生: 从myApp.java读取文件example.txt 停止读取文件example.txt 其他进程写入文件(即echo“foo”>>example.txt) 从myApp.java读取文件example.txt 据我所知,java.nio.FileChannellock只锁定其他JVM应用程序对文件的访问。文件系统

我有一个文件需要读几遍。我必须按顺序打开同一文件的InputStream。现在我想知道,只要Java应用程序的某个特定部分正在运行,是否可以对整个操作系统锁定该文件

我想防止3发生:

  • 从myApp.java读取文件
    example.txt
  • 停止读取文件
    example.txt
  • 其他进程写入文件(即
    echo“foo”>>example.txt
  • 从myApp.java读取文件
    example.txt

  • 据我所知,
    java.nio.FileChannel
    lock只锁定其他JVM应用程序对文件的访问。

    文件系统是操作系统/实现特定的WRT“锁定”,我猜要可靠地做到这一点,您必须通过文件权限来实现

    您没有给出关于OS/文件系统类型的任何细节,因此没有具体的答案


    如果有一种方法可以“锁定”文件系统上的某些文件,我敢打赌,它不会是可移植的。

    我有一个想法,可以防止其他进程访问此文件,那就是在应用程序完成之前重命名它

    1. Load the file and rename it. For example, example.txt to example.txt.tmp
    2. Reading file example.txt.tmp from myApp.java
    .....
    6. Rename your file name back to the original one.
    
    这方面的JavaAPI是。你说:

    据我所知,
    java.nio.FileChannel
    lock只锁定其他JVM应用程序对文件的访问

    这种理解是错误的。从
    FileLock
    的文档中:

    平台依赖关系 此文件锁定API旨在直接映射到底层操作系统的本机锁定功能。因此,文件上的锁应该对所有有权访问该文件的程序可见,而不管这些程序是用什么语言编写的

    锁是否实际阻止另一个程序访问锁定区域的内容取决于系统,因此未指定。某些系统的本机文件锁定功能只是建议性的,这意味着程序必须协同遵守已知的锁定协议,以保证数据完整性。在其他系统上,本机文件锁是强制性的,这意味着如果一个程序锁定文件的某个区域,那么其他程序实际上会被阻止以违反该锁定的方式访问该区域。在其他系统上,本地文件锁是建议性的还是强制性的,都可以根据每个文件进行配置。为了确保跨平台的行为一致且正确,强烈建议将此API提供的锁当作建议锁使用

    [……]


    但是,正如您所看到的,锁的确切性质是特定于平台的。

    相反。为VM保留锁。因此,其他进程将被阻止。但是虚拟机中的多个线程将不会。但实际的锁定功能取决于底层文件系统。有关详细信息,请参阅。在我看来,如果允许的话,请求文件的(原子的,如果FS支持)副本会更简单。Windows支持强制锁定,但Linux不支持强制锁定(强制锁定存在,但很少使用,通常需要显式设置才能启用)。我的目标是为您的问题找到一个替代解决方案。然后,您将丢失由其他进程编写的任何更新。这是一个聪明的想法,但它意味着由其他进程执行的写入操作将在该进程中丢失/擦除。在这种情况下可以接受吗?@Ralf,OP说他想阻止来自其他进程的更新,不是吗?我需要100%地确定,甚至没有任何东西写在屏幕上copy@TranHo,据我所知,这是关于暂时阻止并发访问。不接受写入并将其擦除,就好像什么都没发生一样。。。。