zoukankan      html  css  js  c++  java
  • Java文件锁定

    java文件锁定一般都通过FileChannel来实现。主要涉及如下2个方法:

    • tryLock() throws IOException  试图获取对此通道的文件的独占锁定。
    • tryLock(long position, long size, boolean shared) throws IOException  试图获取对此通道的文件给定区域的锁定。
      1 import java.io.*;
      2 import java.nio.channels.*;
      3 
      4 public class LockFileDemo {
      5 
      6     public static void main(String[] args) throws Exception {
      7         String filePath = "c:\\test.txt";
      8 
      9         File file = new File(filePath);
     10         RandomAccessFile raf = new RandomAccessFile(file, "rw");
     11         FileChannel fc = raf.getChannel();
     12         FileLock fl = fc.tryLock();
     13 
     14         if (fl.isValid()) {
     15             System.out.println("Get the lock successed!");
     16 
     17             // 测试读线程
     18             ReadFile rf = new ReadFile(file);
     19             rf.start();
     20 
     21             // 测试写线程
     22             // WriteFile wf = new WriteFile(file,"This is a test!----幻影");
     23             // wf.start();
     24 
     25         }
     26 
     27         fl.release();
     28         System.out.println("release the lock!");
     29         raf.close();
     30     }
     31 }
     32 
     33 /****
     34  * 写文件
     35  * 
     36  * @author Administrator
     37  * 
     38  */
     39 class WriteFile extends Thread {
     40     File file;
     41     String context;
     42 
     43     public WriteFile() {
     44 
     45     }
     46 
     47     public WriteFile(File file, String context) {
     48         this.file = file;
     49         this.context = context;
     50     }
     51 
     52     public void run() {
     53         FileWriter fw = null;
     54 
     55         try {
     56             fw = new FileWriter(file);
     57             fw.write(context);
     58             fw.flush();
     59         } catch (IOException e) {
     60             e.printStackTrace();
     61         }
     62     }
     63 }
     64 
     65 /****
     66  * 读文件
     67  * 
     68  * @author Administrator
     69  * 
     70  */
     71 class ReadFile extends Thread {
     72     File file;
     73 
     74     public ReadFile() {
     75     }
     76 
     77     public ReadFile(File file) {
     78         this.file = file;
     79     }
     80 
     81     public void run() {
     82         FileReader fr = null;
     83         try {
     84             fr = new FileReader(file);
     85 
     86             int c;
     87             System.out.println("----------开始文件读取----------");
     88             while ((c = fr.read()) != -1) {
     89                 System.out.print((char) c);
     90             }
     91             System.out.println("");
     92             System.out.println("----------文件读取完毕----------");
     93         } catch (FileNotFoundException e) {
     94             System.out.println("文件不存在!");
     95         } catch (IOException e) {
     96             e.printStackTrace();
     97         } finally {
     98             if (fr != null) {
     99                 try {
    100                     fr.close();
    101                 } catch (IOException e) {
    102                     e.printStackTrace();
    103                 }
    104             }
    105         }
    106     }
    107 }

    程序输出:

    Get the lock successed!
    release the lock!
    ----------开始文件读取----------
    This is a test!----幻影
    ----------文件读取完毕----------

    tryLock等同于tryLock(0L, Long.MAX_VALUE, false) ,它获取的是独占锁,所以一定是在释放锁之后,才能读取到文件内容。

    也就是说,上例中,一定会先打印“release the lock!”,然后再打印出文件内容。

    将上面的代码改成(共享锁):

    FileLock fl = fc.tryLock(0, file.length(), true);//共享锁
    
    .......
    
    
    Thread.sleep(2000);//为了区分清楚点
    fl.release();
    System.out.println("release the lock!");
    raf.close();

    那么才可能先打印出文件内容,然后打印“release the lock!”

  • 相关阅读:
    让EditPlus支持SQL高亮提示
    SQL Server 触发器
    asp.net中使用Global.asax文件中添加应用出错代码,写入系统日志文件或数据库
    C#钩子类 几乎捕获键盘鼠标所有事件
    DataGridView一些常用操作
    在C#中实现串口通信的方法
    System.Diagnostics.Process.Start的妙用
    Byte[]、Image、Bitmap 之间的相互转换
    Dos命令打印文件以及Dos打印到USB打印端口
    Winform常用的一些功能收集(持续更新)
  • 原文地址:https://www.cnblogs.com/yejg1212/p/2991963.html
Copyright © 2011-2022 走看看