首页 > 编程语言 >无涯教程-Java NIO - FileLock(文件锁)

无涯教程-Java NIO - FileLock(文件锁)

时间:2023-12-29 15:31:30浏览次数:37  
标签:文件 FileLock java NIO lock Java file import nio

Java NIO支持并发和多线程,这使它能够同时处理在多个文件上运行的多个线程,但是在某些情况下,无涯教程要求文件不能被任何线程共享并且不可访问。为了满足这种要求,NIO提供了FileLock的API,该API用于提供对整个文件或部分文件的锁定,以使该文件或其部分不会共享或不可访问。

为了提供或应用这种锁,无涯教程必须使用FileChannel或AsynchronousFileChannel,它们为此提供了两个方法 lock()和 tryLock()。两种类型-

  • 排他锁     - 排他锁可防止其他程序获取任一类型的重叠锁。

  • 共享锁     - 共享锁可以防止其他同时运行的程序获取重叠的互斥锁,但允许它们获取重叠的共享锁。

用于获取锁定文件的方法-

  • lock()                                                                                   - FileChannel或AsynchronousFileChannel的此方法获取与给定通道关联的文件的排他锁。

  • lock(long position,long size,boolean shared)       - 此方法是lock方法的重载方法,用于锁定文件的特定部分。

  • tryLock()                                                                             - 如果无法获取该锁,并且尝试获取此通道文件上的显式排他锁,则此方法返回FileLock或null。

  • tryLock(long position,long size,boolean shared)  - 此方法尝试获取此通道文件给定区域上的锁,该锁可以是互斥类型或共享类型。

FileLock类的方法

  • acquiredBy()                                            - 此方法返回获取文件锁定的通道。

  • position()                                                  - 此方法返回锁定区域第一个字节在文件中的位置。

  • size()                                                          - 此方法返回锁定区域的大小(以字节为单位)。

  • isShared()                                                 - 此方法用于确定是否共享锁。

  • overlaps(long position,long size)     - 此方法判断此锁是否与给定的锁范围重叠。

  • isValid()                                                    - 此方法判断所获取的锁是否有效,锁对象在释放之前或关闭关联的文件通道之前一直保持有效以先到者为准。

  • release()                                                     - 释放获得的锁。

  • close()                                                         - 此方法调用release()方法,它已添加到类中,以便可以与自动资源管理块构造结合使用。

FileLock示例。

下面的示例创建文件锁定并向其中写入内容

package com.java.nio;
import java.io.IOException;
import java.nio.ByteBuffer;
import java.nio.channels.FileChannel;
import java.nio.channels.FileLock;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.nio.file.StandardOpenOption;
public class FileLockExample {
   public static void main(String[] args) throws IOException {
      String input = "Demo text to be written in locked mode.";  
      System.out.println("Input string to the test file is: " + input);  
      ByteBuffer buf = ByteBuffer.wrap(input.getBytes());  
      String fp = "D:file.txt";  
      Path pt = Paths.get(fp);  
      FileChannel channel = FileChannel.open(pt, StandardOpenOption.WRITE,StandardOpenOption.APPEND);  
      channel.position(channel.size() - 1); //光标在文件末尾的位置
      FileLock lock = channel.lock();   
      System.out.println("The Lock is shared: " + lock.isShared());  
      channel.write(buf);  
      channel.close(); //释放锁
      System.out.println("Content Writing is complete. Therefore close the channel and release the lock.");  
      PrintFileCreated.print(fp);  
   }  
}
package com.java.nio;
import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
public class PrintFileCreated {
   public static void print(String path) throws IOException {  
      FileReader filereader = new FileReader(path);  
      BufferedReader bufferedreader = new BufferedReader(filereader);  
      String tr = bufferedreader.readLine();    
      System.out.println("The Content of testout.txt file is: ");  
      while (tr != null) {      
         System.out.println("    " + tr);  
         tr = bufferedreader.readLine();  
      }  
   filereader.close();  
   bufferedreader.close();  
   }  
}

运行上面代码输出

Input string to the test file is: Demo text to be written in locked mode.
The Lock is shared: false
Content Writing is complete. Therefore close the channel and release the lock.
The Content of testout.txt file is: 
To be or not to be?Demo text to be written in locked mode.

参考链接

https://www.learnfk.com/java-nio/java-nio-filelock.html

标签:文件,FileLock,java,NIO,lock,Java,file,import,nio
From: https://blog.51cto.com/u_14033984/9028478

相关文章

  • JAVA面向对象程序设计
    第2章:类与对象定义类:在Java中,一个类是创建对象的蓝图或原型。类定义了一组属性(变量)和方法(函数)。-创建类:演示一个简单的Java类的声明,包括类名、属性和方法。```javapublicclassPhone{//属性(Variables)Stringbrand;Stringmodel;intprice;//方法(Methods)voidcall(S......
  • 【GC】Java中常见的垃圾回收算法
    Java中常见的垃圾回收算法有以下几种:标记-清除算法(Mark-and-Sweep):该算法分为两个阶段,标记阶段和清除阶段。在标记阶段,垃圾回收器会遍历堆中的对象,并标记所有可达对象。在清除阶段,垃圾回收器会遍历堆中的对象,清除所有未被标记的对象。复制算法(Copying):该算法将堆分成两个区域......
  • 【算法】Java版
    二分查找算法二分查找算法(BinarySearchAlgorithm)是一种在有序数组中查找特定元素的搜索算法。该算法的基本思想是将数组从中间分成两部分,然后与目标元素进行比较,进而确定目标元素位于左半部分还是右半部分,不断缩小搜索范围,直到找到目标元素或确定目标元素不存在。以下是一个使......
  • 无涯教程-Java NIO - AsynchronousFileChannel
    无涯教程知道JavaNIO支持并发和多线程,这允许同时处理不同的通道,因此JavaNIO包中负责此操作的API是AsynchronousFileChannel。AsynchronousFileChannel与NIO的FileChannel相似,不同之处在于此通道使文件操作能够异步执行。在异步中,线程将请求传递给操作系统的内核以完成请求,而......
  • Java反射,看完就会用
    什么是反射在说反射概念之前,我们先说另外2个概念:编译期和运行期。编译期:编译期是源代码从文本形式转换为字节码的过程,这发生在Java代码被JVM执行之前。在编译期,编译器对源代码进行语法检查、类型检查、变量名解析等操作,确保代码符合Java的语法规则,并将其编译成字节码(.class文......
  • 无涯教程-Java NIO - Path(路径)
    顾名思义,Path是实体(如文件或目录)在文件系统中的特定位置,以便人们可以在该特定位置搜索和访问它。通常,一个实体的路径可以是两种,一种是绝对路径,另一种是相对路径,为了获得Path的,无涯教程可以使用java.nio.file.Paths类get()的静态方法。如上所述,绝对路径是通过传递根元素和定......
  • Java第二十课_File
    1.FileFile常用函数publicstaticvoidmain(String[]args)throwsIOException{//相对路径:IO流默认目录:当前项目工程开始自己算//绝对路径:带盘符的路径://网络路径:https://img2.baidu.com/it/u=3164322677,862193441&fm=2......
  • linux下java调用netcore程序
    代码备份仅供参考自述文件#JavaCallCSharpJavacallC#libbuildwith.NETCORE2.0viaC++aswraperThecodeisbasedon[examplefromcoreCLR](https://github.com/dotnet/coreclr/tree/master/src/coreclr/hosts/unixcoreruncommon)JavausingJNItocallC++......
  • Linux下netcore调用java代码
    代码备份,仅供参考自述文件#CSharpCallJavaC#invokeJavaviaC++asawraper.C#invokeC++viaP/invoke.C++startsaJVMtoruntheJavacode.C#codeshouldbecompiledin.NETcore2.0YoushouldedittheMakefiletosetthePathofJavaSDKexpor......
  • 关于IDEA报 java: 无法访问java.lang.Record 找不到java.lang.Record的类文件
    IDEA一直报java:无法访问java.lang.Record  找不到java.lang.Record的类文件,但是我已经把所有的java配置改成了17。最后发现是pom文件中org.apache.maven.plugins配置没有改。属性修改如下:<configuration><compilerVersion>1.8</compilerVersion>-......