现在有个需求,需要控制多进程访问文件的问题,所谓多进程可能并不是只有java的程序会访问,期间可能还有C#的程序同时也要访问这个文件。现在我在程序里会先调用canWrite()后再去执行文件读写。但是的问题是当还有另一个进程(比如C#写的程序)同时访问时会有问题,在很小的几率下可能会发生调用canWrite()时是可以写的,但是在下面创建文本流的一瞬间文件变为不能写了。我不知道会不会发生类似的事情?大家如何解决这个问题?原本是想创建一个签出文件,但是这样效率太低,因为java程序每隔1秒就有可能写文件。

解决方案 »

  1.   

    像linux的log服务那样,做一个服务,专门用来写这个文件。
    c#和java都调用这个服务对这个文件进行操作
      

  2.   

    我换了一种思路来解决这个问题具体访问:
    http://blog.csdn.net/wsxqaz/article/details/7194094
      

  3.   


    这个抢锁的过程不能保证同步吧
    比如A, B两个进程要访问test.txt
    如果A要改名,证明A已经找到了test.txt
    同理B也一样如果A改成了test.txt.ch
    这时候B如果也找到了,但是是在A改名前找到的,他再改名就要出错了咯,因为文件已经不存在了if (FileExists(filename)){
    then RenameFileTo(newFilename)
    }你能保证Rename的过程是synchronized,但不能保证上面一块代码都synchronized吧
    或者B找不到文件进行rename就忽略它,不作为一个异常?
      

  4.   

    我觉得做为一个服务单独写文件比较好。java和C#都直接调用这个服务。
      

  5.   


    现在如果B找不到文件将会忽略这个异常,签入签出被写在单独的方法理,这个如果发生的是这个异常就认为是文件已经被签出直接返回false,否则改名成功则返回true表示可以继续修改
      

  6.   

    你这种方法就不可取,循环读不能保证同步
    除非你循环的周期接近cpu的时钟频率
      

  7.   

    还有就是写个通用的接口如:webService等等, 所有的外界调用全部调用这个接口去
      

  8.   

    写一个外部通用的接口 如:webService, 在这个接口上加单例, 其他的你就做一个等待盏