详见:http://blog.yemou.net/article/query/info/tytfjhfascvhzxcyt208

在对文件操作过程中,有时候需要对文件进行加锁操作,防止其他线程访问该文件。对文件的加锁方法有两种:

第一种方法:使用RandomAccessFile类操作文件。

在java.io.RandomAccessFile类的open方法,提供了参数实现独占的方式打开文件:

RandomAccessFile raf = new RandomAccessFile(file, "rws");

其中的“rws”参数,rw代表读取和写入,s代表了同步方式,也就是同步锁。这种方式打开的文件,就是独占方式的。

第二种方法:使用sun.nio.FileChannel对文件进行加锁。

代码:

RandomAccessFile raf = new RandomAccessFile("file.txt", "rw");

FileChannel fc = raf.getChannel();

FileLock fl = fc.tryLock();

if(fl.isValid())

System.out.println("You have got the file lock.");

以上是通过RandomAccessFile来获得文件锁的,那么在写文件的时候如何对文件加锁呢?方法如下:

代码:

FileOutputStream fos = new FileOutputStream("file.txt");

FileChannel fc = fos.getChannel(); //获取FileChannel对象

FileLock fl = fc.tryLock();  //or fc.lock();

if(null != fl)

System.out.println("You have got file lock.");

//TODO write content to file

//TODO write end, should release this lock

fl.release(); //释放文件锁  注意:释放锁要在文件写操作之前,否则会出异常

fos.close;  //关闭文件写操作

如果在读文件操作的时候,对文件进行加锁,怎么操作呢?从API文档中我们可以看到,FileChannel也可以从FileInputStream中直接获得,但是这种直接获得FileChannel的对象直接去操作FileLock会报异常NonWritableChannelException,这样我们又怎么去获得文件锁呢?需要自己去实现getChannel方法,代码如下:

private static FileChannel getChannel(FileInputStream fin, FileDescriptor fd) {

FileChannel channel = null;

synchronized(fin){

channel = FileChannelImpl.open(fd, true, true, fin);

return channel;

}

}

其实,我们看FileInputStream时,发现getChannel方法与我们写的代码只有一个地方不同,即open方法的第三个参数不同,如果设置为false,就不能锁住文件了。缺省的getChannel方法,就是false,因此,不能锁住文件。

最新文章

  1. python 通用 修饰器
  2. Flash Builder快捷键
  3. linux 回收站的添加
  4. 第一百九十三天 how can I 坚持
  5. 关于 三星 I9100 (水货)
  6. angular 中 directive中的多个指令
  7. Request url 各种属性值
  8. .NET MVC学习笔记(一)
  9. Oracle EBS WMS特征(一)
  10. hadoop系列二:HDFS文件系统的命令及JAVA客户端API
  11. 【转载】从头编写 asp.net core 2.0 web api 基础框架 (2)
  12. phpmyadmin设置密码,不用登录直接进入
  13. 网站开发进阶(十三)window.onload用法详解
  14. Windows上安装配置SSH教程(1)——知识点汇总
  15. 【翻译】七个习惯提高Python程序的性能
  16. 阻止a链接跳转方法总结
  17. [LeetCode] 98. Validate Binary Search Tree(是否是二叉搜索树) ☆☆☆
  18. flask你一定要知道的上下文管理机制
  19. python3.5 中Django框架连接mysql
  20. Email feedback to product team about TFS and SharePoint Integration 2017.2.15

热门文章

  1. 你可能需要为你的APP适配iOS11
  2. 统一代码风格工具——editorConfig
  3. 利用dbutils工具实现数据的增删查改操作(dbutis入门)
  4. iframe中的模态框遮罩父窗口原理
  5. LoadRunner入门(一)
  6. 【模板--完全背包】HDU--2602 Bone Collector
  7. CSS禁止用户选择复制
  8. jQuery之jquery.lazyload.js插件用法
  9. angular学习(二)-- Directive
  10. Markdown简明教程