`
hbcui1984
  • 浏览: 149312 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

FileChannel的Lock方法怎么总报错

    博客分类:
  • java
阅读更多
我想在一个线程中读取文件,当该线程读取该文件时,其他线程不能对该文件操作,我的代码如下:

File file=new File("/root/test.txt");
try {
FileInputStream fis=new FileInputStream(file);
FileChannel fc=fis.getChannel();
fc.tryLock();
byte[] buf = new byte[1024];
        StringBuffer sb=new StringBuffer();
        while((fis.read(buf))!=-1){
            sb.append(new String(buf));   
            buf=new byte[1024];//重新生成,避免和上次读取的数据重复
        }
        System.out.println(sb.toString());
        fc.close();
fis.close();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}

可是,程序却总报出如下异常:
Exception in thread "main" java.nio.channels.NonWritableChannelException
at sun.nio.ch.FileChannelImpl.tryLock(FileChannelImpl.java:818)
at java.nio.channels.FileChannel.tryLock(FileChannel.java:967)
at chb.mail.Calendar_chb.main(Calendar_chb.java:22)

利用同样的方法在写文件时就没有问题,各位达人啊。
分享到:
评论
5 楼 hbcui1984 2006-12-13  
基本问题已经解决,具体论述可以参看:
http://blog.csdn.net/hbcui1984/archive/2006/12/12/1440226.aspx
4 楼 hbcui1984 2006-12-12  
似乎文件的共享锁或独占锁与操作系统有关

我在家里在windows环境下,完全可以给文件加锁
但是到了公司在linux下,FileChanel就没有作用了
3 楼 hbcui1984 2006-12-11  
关键我想问的是,有没好的方法来确定一个文件是否正在被某个线程使用?
2 楼 hbcui1984 2006-12-11  
Readonly 写道
你的Channel是由InputStream过来的,当然是NonWritable了。


将程序改动如下:
fc.tryLock(0,Long.MAX_VALUE,true);
就不会有刚才的异常了。

可是传入的参数true表示可以共享,可是我要求不能共享,传入false的时候还会报出刚才一样的错误,为什么啊?

还有利用FileChannel真的可以给stream加锁吗?
我同时利用两个线程,一个往文件里写内容,一个线程读同一个文件的数据
我希望同一时间只有一个线程可以操作该文件,结果却并不如此,两个线程好像在同时运行
写的线程正在写的时候,读的线程却已经开始了读取文件内容,郁霉中,后面附有代码,看一眼啊,谢谢!
1 楼 Readonly 2006-12-11  
你的Channel是由InputStream过来的,当然是NonWritable了。

相关推荐

Global site tag (gtag.js) - Google Analytics