`

对映射文件的部分加锁

 
阅读更多

  文件映射通常应用于极大的文件,我们可能需要对这种巨大的文件进行部分加锁,以便其他进程可以修改文件中未被加锁的部分。例如:数据库就是这样,因此多个用户可以同时访问它。

看个例子:连个线程分别对文件的不同部分加锁:

package com.wjy.nio;

import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.RandomAccessFile;
import java.nio.ByteBuffer;
import java.nio.MappedByteBuffer;
import java.nio.channels.FileChannel;
import java.nio.channels.FileLock;

public class LockingMappedFiles {
	static final int LENGTH=0x8FFFFFF;
	static FileChannel fc;
	public static void main(String args[]){
		try {
			fc=new RandomAccessFile("./file/test.dat", "rw").getChannel();
			MappedByteBuffer out=fc.map(FileChannel.MapMode.READ_WRITE, 0, LENGTH);
			for(int i=0;i<LENGTH;i++){
				out.put((byte)'x');
			}
			new LockAndModify(out,0,0+LENGTH/3);
			new LockAndModify(out,LENGTH/2,LENGTH/2+LENGTH/4);
		} catch (FileNotFoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		
	}
	private static class LockAndModify extends Thread{
		private ByteBuffer buff;
		private int start,end;
		LockAndModify(ByteBuffer mbb,int start,int end){
			this.start=start;
			this.end=end;
			mbb.limit(end);
		     mbb.position(start);
		     buff=mbb.slice();
			start();
		}
		public void run(){
			try {
				FileLock fl=fc.lock(start, end, false);
				System.out.println("Locked: "+start+"  to  "+end);
				while(buff.position()<buff.limit()-1){
					buff.put((byte)(buff.get()+1));
				}
				fl.release();
				System.out.println("Release: "+start+"  to  "+end);
			} catch (Exception e) {
				// TODO: handle exception
			}
		}
	}
}

 注意这里是一个对缓冲区分片的操作:

        mbb.limit(end);           //设置尾部
		     mbb.position(start);  //设置开头
		     buff=mbb.slice();      //分片

 

分享到:
评论

相关推荐

    映射文件操作封装类

    在这个类中,我们将定义一个名为`LogFileMap`的类,该类的核心功能是对映射文件进行操作。类的结构可能包括以下部分: 1. **成员变量**:用于存储映射文件的相关信息,如文件句柄、映射视图的指针、文件大小等。 2....

    linux 文件I/O编程

    在Linux系统中,文件I/O(输入/输出)编程是操作系统与应用程序交互的重要部分,它涉及到数据在程序和磁盘之间的传输。以下是对标题和描述中提到...在深入学习时,还可以探索更多高级特性,如异步I/O、内存映射文件等。

    OS文件管理

    9. **内存映射文件**:对于大文件,可以使用内存映射文件(MapViewOfFile()),将文件的部分或全部内容映射到进程的地址空间,提高读写效率。 10. **文件缓冲**:为了提高性能,可以使用缓冲技术,预先读取或写入一...

    文件管理习题集与答案解析.doc

    2. **文件符号名与物理地址的转换**:文件的逻辑名称与实际存储位置之间的映射是通过文件目录来实现的,而不是通过索引、索引节点或二级索引。 3. **UNIX 文件系统**:在 UNIX 系统中,空闲块的管理通常采用成组法...

    U盘、移动硬盘文件加密软件

    采用最高强度(AES256位)真加密算法加密文件,将您计算机磁盘中的部分区域进行加密,并生成一个加密区,只有当用户 使用自己的账号和密码登录后才能被解密使用,并映射为一个虚拟盘,只需要把文件放入虚拟盘即可自动...

    FeatureClassLoad_导入数据到mdb_C#arcengine数据映射导入_worriedkk8_MDB-478_字

    综上所述,"FeatureClassLoad_导入数据到mdb_C#arcengine数据映射导入_worriedkk8_MDB-478_字"这个任务涉及到多个技术点,包括GIS数据转换、C#编程、ArcEngine API使用、字段映射、文件锁定、错误处理和性能优化。...

    任务一-基于FUSE的文件系统1

    **文件系统元数据**是文件系统的核心组成部分,包括以下几个关键元素: 1. **Superblock**:存储文件系统整体信息,如文件系统的大小、版本、分配策略等。通常,为了容错,会有多个副本,一致性保证通常依赖于文件...

    hibernate-note学习笔记

    - **xxx.hbm.xml**: 映射文件,每个需要持久化的类都有一个对应的映射文件,用于定义对象与数据库表之间的映射关系。 - **Hibernate API**: 提供了与数据库交互的各种API,包括Session、SessionFactory等。 - **JDBC...

    文件夹嗅探器3.51

     2005.10.5 2.2 增加“映射到驱动器-Z:”功能,可以用此功能将无法复制的加密文件所在路径映射到驱动器-Z:,从而方便访问修改。  2005.8.4 2.1 针对《高强度文件夹加密大师9000》改写代码,可以搜索出“移动...

    Hibernate学习笔记

    - **实现方法**:可以在映射文件中定义组件类型的集合,从而实现组件与集合的映射。 #### 对象状态与识别 - **状态分类**:包括瞬时态、托管态和持久态三种状态。 - **识别机制**:Hibernate通过对象的标识符(OID...

    Hibernate 开发学习指导书

    构建Hibernate的基础代码主要包括两部分:POJO类和Hibernate映射文件。 ##### 1. POJO (Plain Ordinary Java Object) POJO是Hibernate中非常重要的概念,它是数据库表在Java中的表示形式。通常来说,POJO就是一个...

    Hibernate电子书(全)

    构建第一个Hibernate程序通常包括以下几个步骤:定义实体类,创建映射文件,配置Hibernate,初始化SessionFactory,执行CRUD(创建、读取、更新、删除)操作。通过这个过程,开发者可以熟悉Hibernate的基本工作流程...

    UNIX 高级教程系统技术内幕

    14.2 内存映射文件 14.2.1 mmap 及相关系统用 14.3 VM 设计原理 14.4 基本抽象概念 14.4.1 物理内存 14.4.2 地址空间 14.4.3 地址映射 14.4.4 匿名页面 14.4.5 硬件地址转换 14.5 段驱动程序 14.5.1 seg-vn 14.5.2 ...

    mmkv.zip

    MMKV是由微信团队基于MMDB(MMFiles)数据库开发的一个跨平台的内存映射文件存储系统,主要针对Android和iOS平台。其核心设计思想是利用内存映射技术,将磁盘文件直接映射到进程的虚拟内存中,从而实现了高效的读写...

    TCP-IP详解卷1:协议00008

    NFS是一种允许客户机透明访问远程服务器文件和文件系统的协议,它与FTP等传统文件传输协议不同,FTP会创建文件的完整副本,而NFS仅访问客户机所引用的部分文件内容,旨在实现访问透明化,即客户机程序无需修改即可...

    开源项目-streamrail-concurrent-map.zip

    2. **锁的粒度控制**:通过细粒度的锁来减少锁竞争,例如,可以为映射的不同部分分配独立的锁。 3. **线程安全的插入、删除和查找操作**:每个操作都需要在适当的锁保护下进行,以防止数据损坏。 4. **性能优化**:...

    hibernate详细笔记.

    12. **使用示例**: 创建新项目,添加Hibernate库和JDBC驱动,配置数据库连接,创建实体类并注解,编写映射文件,最后通过SessionFactory创建Session并执行CRUD操作。 理解并熟练掌握这些知识点,将有助于你在实际...

Global site tag (gtag.js) - Google Analytics