- 浏览: 831310 次
- 性别:
- 来自: 深圳
文章分类
- 全部博客 (379)
- struts (5)
- hibernate (16)
- spring (16)
- ssh (20)
- MySQL (16)
- 数据库脚本 (2)
- DownLoad (1)
- GAE (5)
- Java (103)
- LoadRunner (2)
- VF (1)
- 学习资料 (24)
- 软件使用 (21)
- 通信类 (4)
- 生活 (3)
- J2ME (1)
- 心理学 (1)
- Linux (26)
- Android (3)
- Oracle (1)
- 面向对象概念&面试准备 (11)
- ExtJs (2)
- Google Map (1)
- Flex (47)
- 算法研究 (1)
- share (20)
- python (1)
- MongoDB (7)
- centos6 (13)
- C++ (8)
- DB2 (3)
- C# (1)
- 代码片段 (24)
- Lucene (2)
- php (1)
- NodeJS (1)
- Express (1)
最新评论
-
shua1991:
已阅,我表示同意。
Eclipse统计代码行数 -
nakedou:
写的不错,挺详细的
在CentOS中使用 yum 安装MongoDB及服务器端配置 -
sjp524617477:
好方法
Eclipse统计代码行数 -
simpletrc:
<script>ale ...
Java写到.txt文件,如何实现换行 -
csdn_zuoqiang:
Apache Ftp Server,目前是1.0.4,非常好的 ...
Apache FtpServer在64位系统下服务不能启动解决方法
文件锁
JDK 1.4引入了文件加锁机制,允许我们同步访问一个共享文件,不过,竞争同一文件的两个线程有可能在不同的java虚拟机上,或者一个是java线程,另一个是操作系统中其他的某个线程,但文件锁对其他线程或其他操作系统进程都是可见的,因为java的文件加锁直接映射到了本地操作系统的加锁机制。
注,这里讲的锁是指锁定其他应用程序,而不是锁定同一虚拟机里访问的同一文件的其他线程 。如果在同一虚拟机两次锁定同一文件或某文件里的同一区域,tryLock与lock则会抛出OverlappingFileLockException异常。
要想获取整个文件的锁,可以用FileChannel的tryLock( )或lock(
)方法。(SocketChannel,DatagramChannel,以及
ServerSocketChannel是不需要锁的,因为它们是从单进程实体继承而来;一般来说,你是不会让两个进程去共享一个网络socket的。tryLock(
) 是非阻塞的,它会试着去获取这个锁,但是如果得不到(其它进程已经以独占方式得到这个锁了),那它就直接返回;而lock(
)是阻塞的,如果得不到锁,它会在一直处于阻塞状态,除非它得到了锁,或者你打断了调用它的线程,或者关闭了它要lock()的channel,否则它是不会返回的。最后用FileLock.release(
)释放锁。
还可以像这样锁住文件的某一部分
tryLock(long position, long size, boolean
shared)
或者
lock(long position, long size, boolean shared)
这个方法能锁住文件的某个区域(size - position)。其中第三个参数表示是否是共享锁。
虽然在修改文件的过程中,无参数的lock( )和tryLock( )方法的锁定范围会随文件大小的变化,带参数的方法却不行。如果你锁住了position到position+size这段范围,而文件的长度又增加了,那么position+size后面是不加锁的。而无参数的lock方法则会锁定整个文件,不管它变不变长。
锁是独占的还是共享的,这要由操作系统来决定。如果操作系统不支持共享锁,而程序又申请了一个共享锁,那么它会返回一个独占锁。你可以用FileLock.isShared( )来查询锁的类型(共享还是独占)。
在写文件时才能锁定,如果对一个只读文件通道进行锁定操作时,会抛NonWritableChannelException异常,即new FileInputStream("data2.txt").getChannel().tryLock();时就会抛异常。
另外锁定写文件通道new FileOutputStream("data2.txt").getChannel().tryLock();时,它会清掉原文件中的内容,所以当文件中有内容时最好使用 new FileOutputStream("data2.txt",true).getChannel().tryLock(); 以追加方式打开写文件通道。或者使用RandomAccessFile类来创建文件通道然后锁定 new RandomAccessFile("data2.txt","rw").getChannel().tryLock(); ,这样它不会破坏锁定的文件的内容。
最后在使用tryLock()获取锁时, 有可能获取不到,这时就会为null,我们需能对此做相应处理。以下是简单的销实例:
- import java.io.FileOutputStream;
- import java.nio.channels.FileLock;
- public class FileLocking {
- public static void main(String[] args) throws Exception {
- FileOutputStream fos = new FileOutputStream("file.txt");
- //获取文件锁 FileLock 对象
- FileLock fl = fos.getChannel().tryLock();
- //tryLock是尝试获取锁,有可能为空,所以要判断
- if (fl != null) {
- System.out.println("Locked File");
- Thread.sleep(100);
- fl.release();//释放锁
- System.out.println("Released Lock");
- }
- fos.close();
- }
- }
import java.io.FileOutputStream; import java.nio.channels.FileLock;
public class FileLocking { public static void main(String[] args) throws Exception { FileOutputStream fos = new FileOutputStream("file.txt"); //获取文件锁 FileLock 对象 FileLock fl = fos.getChannel().tryLock(); //tryLock是尝试获取锁,有可能为空,所以要判断 if (fl != null) { System.out.println("Locked File"); Thread.sleep(100); fl.release();//释放锁 System.out.println("Released Lock"); } fos.close(); } }
锁定映射文件中的部分内容
文件映射通常用于很大的文件,因此我们可能需要对文件操作的部分进行加锁,以便其他进程可以修改文件中未被加锁的部分。
- 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 = 0x200000; // 2 Mb
- //static final int LENGTH = 100;
- static FileChannel fc;
- public static void main(String[] args) throws Exception {
- //使用可随机访问文件创建可读写文件通道
- fc = new RandomAccessFile("test.txt", "rw").getChannel();
- //内存映射可读写文件,并映射至整个文件
- MappedByteBuffer out = fc.map(FileChannel.MapMode.READ_WRITE, 0, LENGTH);
- for (int i = 0; i < LENGTH; i++) {//写满2M内容
- out.put((byte) 'x');
- }
- //锁定前1/3内容
- new LockAndModify(out, 0, 0 + LENGTH / 3);
- //从文件中间开始锁定1/4内容,注,要锁定的内容一定不能有与
- //已经锁定的内容,否则抛OverlappingFileLockException
- new LockAndModify(out, LENGTH / 2, LENGTH / 2 + LENGTH / 4);
- }
- 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);
- System.out.println(buff.position() + " " + buff.limit());
- // 进行修改操作,前当前位置类
- while (buff.position() < buff.limit() - 1) {
- buff.put((byte) (buff.get() + 1));
- }
- //JVM退出,或者channel关闭的时候会自动释放这些锁,但是你也可以用FileLock
- //的release( )方法,明确地释放锁,就像这里释放锁一样
- fl.release();
- System.out.println("Released: " + start + " to " + end);
- } catch (IOException e) {
- throw new RuntimeException(e);
- }
- }
- }
- }
发表评论
-
微信JS
2013-10-26 21:17 2042<div class="iteye-blog- ... -
ubuntu下MySQL用source命令导入sql文件出现乱码解决方法
2012-11-18 23:46 1487首先建立数据库的时候指明数据库编码如: CREA ... -
RandomAccessFile
2012-10-18 18:16 944public void run() { try { ... -
java中多种方式读文件
2012-10-18 16:53 927java中多种方式读文件一、多种方式读文件内容。1、按字节读取 ... -
FileChannelMain
2012-10-15 18:12 1075package scan; import java ... -
IDEA 常用配置以及快捷
2012-09-01 10:38 50951. IDEA内存优化 ... -
Ubuntu 10.04 TinyOS
2012-08-20 00:42 1547sudo gedit /etc/apt/sources.lis ... -
我看用户体验与用户价值
2012-07-01 14:55 1035不知道从什么时候开始,各个信息源都开始充斥着用户体验的讨 ... -
在windows 7上安装Maven2.2.1
2012-06-18 17:00 1219Maven是一个java工具,所以请确保jdk环境已经正确安装 ... -
产品经理如何赢得开发人员的尊重和支持?
2012-06-14 09:08 948对于产品经理来说, ... -
Apache FtpServer在64位系统下服务不能启动解决方法
2012-06-10 21:29 6801Apache FTPServer是一款用Java开发的 ... -
Java 集合类
2012-06-07 22:03 1573Java 集合类 1. 为什么要了解J ... -
Java集合工具类之List - ArrayList & LinkedList
2012-06-07 21:21 19001.ArrayList 的数据结构 ... -
网络爬虫调研报告
2012-06-06 11:17 6011网络爬虫调研报告 调研背景 项目中要对 ... -
海量数据处理
2012-06-05 10:02 1869一:常见的题目:- 1 ... -
short、int、long与byte之间的转换工具类
2012-05-31 11:05 4478/** * 各基础类型与byte之间的转换 * ... -
Ubuntu 12.04 改造指南
2012-05-28 10:47 1402升级12.04已经有一段时间了。作为一个从08年就开始用 ... -
使用apt-get方式为Linux Mint 13安装PHP+MYSQL+Apache
2012-05-25 17:48 4768使用apt-get方式为Ubuntu安装PHP+MYSQ ... -
Linux Mint 13 配置JAVA 环境
2012-05-24 22:35 26210.1--下载 JAVA ... -
CentOS 5.5下搭建部署独立SVN服务器全程详解
2012-05-10 10:08 1130SVN服务器有2种运行方式: 1、独立服务器 (例如:s ...
相关推荐
强大的文件删除工具,当你删除文件时,可能遇到文件无法删除,这时候,filelock就可以轻松帮助你解决文件。
CnCrypt FileLock添加文件或目录后,创建自定义保护规则。能够提供隐藏、锁定、隐藏并锁定三种保护模式,可添加例外进程。保护你的文件、文件夹不被别人轻易打开、阅读、修改、删除、移动、复制,甚至你可以设置让...
文件锁 便携式文件锁定 在文件上放置排他或共享锁。 它在Windows上使用LockFile ,在类似Unix的系统上使用fcntl锁。 安装 照常从CRAN安装软件包: install.packages( " filelock " ) 用法 library( filelock ) 这...
我昨天刚开始用的加密软件,可以一次加密多个文件。如果想加密文件夹的话可以先将其打包。用过后感觉不错的。软件不需安装,但需要点击“绿化”。安装时请查看解压目录上的说明。加密器的初始密码是123456,绿化后请...
NULL 博文链接:https://sosuny.iteye.com/blog/704587
python库。 资源全名:filelock-3.0.3.tar.gz
使用FileLock实现进程的互斥.rar,太多无法一一验证是否可用,程序如果跑不起来需要自调,部分代码功能进行参考学习。
Linux&UNIX;系统编程手册源码副本
使用FileLock实现进程的互斥对应的说明在这里http://blog.csdn.net/codehxy/article/details/50274709
离线安装包,亲测可用
资源来自pypi官网。 资源全名:types_filelock-0.1.3-py2.py3-none-any.whl
群 flock实现了线程安全的sync.Locker接口,用于文件锁定。 它还包括一个非阻塞的TryLock()函数,以允许锁定而不会阻塞执行。执照flock是根据BSD 3-条款许可发布的。 有关更多详细信息,请参见LICENSE文件。兼容该...
python库,解压后可用。 资源全名:types_filelock-0.1.3-py2.py3-none-any.whl
开源的文件锁 ,包含有lockfile的源码
文件加密 源码 file lock 文件加密 源码 file lock
教程内容涵盖:阻塞和非阻塞IO、Channel通道、Buffer缓冲区、Selector选择器、Pipe管道、FileLock文件锁,以及Path、Files、异步FileChannel和Charset字符编码等,并通过一个多人聊天室的综合案例,把所有的NIO知识...
文件锁源码,简单的上锁,解锁,其中多处是项目中特有的文件,可以删除自定义,有多个重载方法可以选择。主要形式都是一样的,就是创建文件,删除文件的工具类。
双击“giliflp410”安装,把“FileLock”复制到软件目录。(英文版)
10 11文件锁FileLock 10 12Process类中的流 10 13带进度条的输入流 习题 第11章Java网络的基本知识 11 1使用URL 11 2读取URL中的资源 11 3显示URL资源中的HTML文件 11 4处理超链接 11 5InetAdress类 11 6套接字 11 7...
它可以将您私密的文件、文件夹和磁盘驱动器信息,提供隐藏、禁止读取、防写保护、监控、安全删除及自我保护等等功能,保护您私密的文件、文件夹和磁盘驱动器信息,不会被其他人看见、阅读及修改,并能监控文件修改...