日期:2014-05-20  浏览次数:20676 次

java FileLock在win7下和ubuntu下行为不一样?
最近在ubuntu下装了JDK eclipse Tomcat等等一堆东西 打算熟悉下在linux-based的系统下怎么工作 
然后刚刚在win7为了好玩测试了一个程序 用来锁住一个java文件 然后用javac 其实我是为了看看会得到怎么样的出错信息(有个人出现了个不能读取java的错误信息 后来发现是权限问题 而不是文件找不到或者文件名等其他原因)
Java code
import java.io.*;
import java.nio.*;
import java.nio.channels.*;

public class TryLock{
  public static void main(String args[]) throws Exception{
    File file=new File("Text.java");
    FileOutputStream pis=new FileOutputStream(file,true);
    FileChannel fc=pis.getChannel();
    FileLock fl=fc.tryLock();
    System.out.println(fl);
    Thread.sleep(30*1000);    
    if(fl!=null){
      fl.release();
    }
    fc.close();
  }
}

Text.java无非就是helloworld之类的
以上是用来锁的代码 在win下 我先在一个cmd下运行这个程序 然后我在30s内 在另一个cmd下 用javac Text.java 会出现:
读取Text.java时出错,另一个程序已锁定文件的一部分,进程无法访问。
然后用文本编辑器读Text.java 文件也是空白 30s后 恢复正常

但是在ubuntu下 我也如上操作 并且打开了两个terminal 发现一切正常可以正常编译Text.java 然后用ubuntu下的文本编辑器也是可以正常打开 保存的(我确定没有过30s 我一直看着另一个terminal的)
对了 忘说了 Text.java在ubuntu下的权限操作没有问题 我是rw和rwx都试过 还是一样的

是linux-based的和win在进程管理方面不一样导致的嘛? 但这样的话 java的跨平台性不是被减弱了嘛..

------解决方案--------------------
这是操作系统对文件管理的差异性造成的,具体可以去Google下关于Linux的文件管理。

这么说吧,Linux系统中,你甚至可以直接删除一个已经被Tomcat打开了而且还正在拼命写信息的日志文件。
------解决方案--------------------
这与操作系统相关
正如LS所说,在linux下当一个文件正在使用的时候,可以使用rm将其删除
而在win下文件正在使用,删除的时候会报错

系统内部机制不一样