Java学习者论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

手机号码,快捷登录

恭喜Java学习者论坛(https://www.javaxxz.com)已经为数万Java学习者服务超过8年了!积累会员资料超过10000G+
成为本站VIP会员,下载本站10000G+会员资源,购买链接:点击进入购买VIP会员
JAVA高级面试进阶视频教程Java架构师系统进阶VIP课程

分布式高可用全栈开发微服务教程

Go语言视频零基础入门到精通

Java架构师3期(课件+源码)

Java开发全终端实战租房项目视频教程

SpringBoot2.X入门到高级使用教程

大数据培训第六期全套视频教程

深度学习(CNN RNN GAN)算法原理

Java亿级流量电商系统视频教程

互联网架构师视频教程

年薪50万Spark2.0从入门到精通

年薪50万!人工智能学习路线教程

年薪50万!大数据从入门到精通学习路线年薪50万!机器学习入门到精通视频教程
仿小米商城类app和小程序视频教程深度学习数据分析基础到实战最新黑马javaEE2.1就业课程从 0到JVM实战高手教程 MySQL入门到精通教程
查看: 273|回复: 0

[JavaIO学习]JAVA文件锁实例

[复制链接]
  • TA的每日心情
    开心
    2021-3-12 23:18
  • 签到天数: 2 天

    [LV.1]初来乍到

    发表于 2014-10-31 23:58:08 | 显示全部楼层 |阅读模式
    文件锁定初看起来可能让人迷惑。它似乎指的是防止程序或者用户访问特定文件。事实上,文件锁就像常规的 java 对象锁 ? 它们是 劝告式的(advisory) 锁。它们不阻止任何形式的数据访问,相反,它们通过锁的共享和获取赖允许系统的不同部分相互协调。

         您可以锁定整个文件或者文件的一部分。如果您获取一个排它锁,那么其他人就不能获得同一个文件或者文件的一部分上的锁。如果您获得一个共享锁,那么其他人可以获得同一个文件或者文件一部分上的共享锁,但是不能获得排它锁。

        文件锁定并不总是出于保护数据的目的。例如,您可能临时锁定一个文件以保证特定的写操作成为原子的,而不会有其他程序的干扰。 大多数操作系统提供了文件系统锁,但是它们并不都是采用同样的方式。有些实现提供了共享锁,而另一些仅提供了排它锁。事实上,有些实现使得文件的锁定部分不可访问,尽管大多数实现不是这样的。  
      
       
       

         
       

         
       
      
        在java nio中提供了文件锁的功能,这样当一个线程将文件锁定之后,其他线程是无法操作此文件的,要进行文件的锁定操作,则要使用FileLock类来完成,此类的对象需要依靠FileChannel进行实例化操作。

    关于锁定的方式: 1 共享锁:允许多个线程进行文件的读取操作
    2 独占锁: 只允许一个线程进行文件的读/写操作  这个程序是将a.txt文件锁定60秒
    1. import java.io.*;
    2. import java.nio.channels.FileChannel;  
    3. public class FileLock {
    4.   public static void main(String[] args) throws Exception {
    5.         String path = FileLock.class.getClassLoader().getResource("a.txt").getPath();
    6.         File file = new File(path);
    7.        
    8.         RandomAccessFile raf = new RandomAccessFile(file, "rw");
    9.         FileChannel channel = raf.getChannel();
    10.         java.nio.channels.FileLock lock = channel.tryLock();
    11.         //锁定60秒
    12.         Thread.sleep(60*1000);
    13.         //释放
    14.         lock.release();
    15.         //close
    16.         channel.close();
    17.         raf.close();
    18.    }
    19. }
    复制代码
    接下来立即运行:读 a.txt文件
    1. import java.io.*;
    2. import java.nio.channels.FileChannel;
    3. import java.nio.ByteBuffer;
    4. public class ReadFile {  
    5.   
    6.     public static void main(String[] args) throws Exception {  
    7.         String path = FileLock.class.getClassLoader().getResource("a.txt").getPath();  
    8.         File file = new File(path);  
    9.          
    10.         FileInputStream ins = new FileInputStream(file);  
    11.          
    12.         FileChannel fIns = ins.getChannel();  
    13.          
    14.         ByteBuffer buffer = ByteBuffer.allocate(1024);  
    15.          
    16.         while (true) {  
    17.             buffer.clear();  
    18.             int r = fIns.read(buffer);  
    19.             if(r == -1){  
    20.                 break;  
    21.             }  
    22.             buffer.flip();  
    23.             out(buffer);  
    24.         }  
    25.   
    26.     }  
    27.       
    28.     public static void out(ByteBuffer buffer){  
    29.         for (int i = 0; i < buffer.limit(); i++) {  
    30.             System.out.print(buffer.get());  
    31.         }  
    32.     }  
    33.   
    34. }  
    复制代码
    C:ex>java ReadFile
    Exception in thread "main" java.io.IOException: 另一个程序已锁定文件的一部分,进 程无法访问。
    at sun.nio.ch.FileDispatcherImpl.read0(Native Method)
    at sun.nio.ch.FileDispatcherImpl.read(FileDispatcherImpl.java:55)
    at sun.nio.ch.IOUtil.readIntoNativeBuffer(IOUtil.java:218)
    at sun.nio.ch.IOUtil.read(IOUtil.java:191)
    at sun.nio.ch.FileChannelImpl.read(FileChannelImpl.java:143)
    at ReadFile.main(ReadFile.java:18)



      
      
       
       

         
       

         
       
      
    复制代码

    源码下载:http://file.javaxxz.com/2014/10/31/235808468.zip
    回复

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    QQ|手机版|Java学习者论坛 ( 声明:本站资料整理自互联网,用于Java学习者交流学习使用,对资料版权不负任何法律责任,若有侵权请及时联系客服屏蔽删除 )

    GMT+8, 2025-2-25 19:31 , Processed in 0.301410 second(s), 36 queries .

    Powered by Discuz! X3.4

    © 2001-2017 Comsenz Inc.

    快速回复 返回顶部 返回列表