首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Windows vs OSX FileLock OutputStreamWriter

Windows vs OSX FileLock OutputStreamWriter
EN

Stack Overflow用户
提问于 2013-02-20 18:45:18
回答 1查看 438关注 0票数 0

我编写了一个java应用程序,当其他虚拟机中的其他进程尝试访问文件时,该应用程序会访问该文件。因此,我使用FileLock类:

代码语言:javascript
复制
FileOutputStream fos = new  FileOutputStream(filePath,append);
    FileChannel f = fos.getChannel();
    FileLock lock;

    while ((lock = f.tryLock()) == null){
        try {
            Thread.sleep(100);
        } catch (InterruptedException ex) {
            Logger.getLogger(Util.class.getName()).log(Level.SEVERE, null, ex);
        }
    }

    OutputStreamWriter out = new OutputStreamWriter( new FileOutputStream(filePath,append));
    out.write(textToWrite);
    out.close();
    lock.release();

所有这些在Mac上都运行得很好,但是当我在Windows7上运行代码时,它抛出了IOException

代码语言:javascript
复制
out.close();

,当尝试冲水时。

代码语言:javascript
复制
java.io.IOException: The process cannot access the file because another process has locked a portion of the file
at java.io.FileOutputStream.writeBytes(Native Method)

据我从How does FileLock work?了解,锁的实际获取是通过

代码语言:javascript
复制
f.tryLock()

禁止我访问它,因为另一个进程(显然是这个进程)有排它锁。

现在,我觉得这是一个悖论--当获得锁的实际操作阻碍我这样做时,我如何获得一个外部锁,使我能够写入文件,而不会有其他进程干扰它的危险?

因此,为什么它可以在Mac OS上运行,而不能在windows上运行?我从JavaDocs中了解到,FileLock类存在特定于操作系统的差异和困难,但肯定不是针对其设计的功能。既然情况不是这样,我做错了什么,这就是我向你寻求帮助的地方。

Thx,M

EN

回答 1

Stack Overflow用户

发布于 2013-02-20 18:49:40

在UNIX上没有文件锁定。:http://www.coderanch.com/t/551144/java/java/File-lock-doesn-prevent-threads。事实上,在UNIX上,您可以从进程下删除文件,而它可能甚至不会注意到...

所以你需要使用一个你可以检查是否存在的锁文件。

矛盾的是,您的代码可以在Windows上运行,但不能在UNIX (即Mac OS)上运行,例外情况应该是尝试写入被另一个进程锁定的文件的预期结果。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14977905

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档