一、读取文件

 package lock;

 import java.io.File;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.RandomAccessFile;
import java.nio.channels.FileChannel;
import java.nio.channels.FileLock;
import java.util.Calendar; public class ReadFileLock implements Runnable { public void run() {
try {
Calendar calstart = Calendar.getInstance();
Thread.sleep(5000);
File file = new File("D:/test.txt");
// 给该文件加锁
RandomAccessFile randomAccessFile = new RandomAccessFile(file, "rw");
FileChannel fileChannel = randomAccessFile.getChannel();
FileLock fileLock = null;
while (true) {
try {
fileLock = fileChannel.tryLock();
break;
} catch (Exception e) {
System.out.println("有其他线程正在操作该文件,当前线程" + Thread.currentThread().getName() + "休眠1000毫秒");
Thread.sleep(1000);
}
}
byte[] buf = new byte[1024];
StringBuffer sb = new StringBuffer();
while ((randomAccessFile.read(buf)) != -1) {
sb.append(new String(buf, "utf-8"));
buf = new byte[850];
} System.err.println(sb.toString()); fileLock.release();
fileChannel.close();
randomAccessFile.close();
randomAccessFile = null; Calendar calend = Calendar.getInstance();
System.out.println("当前线程:" + Thread.currentThread().getName() + ",读文件共花了"
+ (calend.getTimeInMillis() - calstart.getTimeInMillis()) + "秒");
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} catch (InterruptedException e) {
e.printStackTrace();
}
} public static void main(String[] args) {
ReadFileLock threadTarget = new ReadFileLock();
Thread read = new Thread(threadTarget);
read.setName("thread-read-file");
read.start();
Thread read2 = new Thread(threadTarget);
read2.setName("thread-write-file2");
read2.start();
} }

二、写文件

package lock;

import java.io.File;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.RandomAccessFile;
import java.nio.channels.FileChannel;
import java.nio.channels.FileLock;
import java.util.Calendar; public class ReadFileLock implements Runnable { public void run() {
try {
Calendar calstart = Calendar.getInstance();
Thread.sleep(5000);
File file = new File("D:/test.txt");
// 给该文件加锁
RandomAccessFile randomAccessFile = new RandomAccessFile(file, "rw");
FileChannel fileChannel = randomAccessFile.getChannel();
FileLock fileLock = null;
while (true) {
try {
fileLock = fileChannel.tryLock();
break;
} catch (Exception e) {
System.out.println("有其他线程正在操作该文件,当前线程" + Thread.currentThread().getName() + "休眠1000毫秒");
Thread.sleep(1000);
}
}
byte[] buf = new byte[1024];
StringBuffer sb = new StringBuffer();
while ((randomAccessFile.read(buf)) != -1) {
sb.append(new String(buf, "utf-8"));
buf = new byte[850];
} System.err.println(sb.toString()); fileLock.release();
fileChannel.close();
randomAccessFile.close();
randomAccessFile = null; Calendar calend = Calendar.getInstance();
System.out.println("当前线程:" + Thread.currentThread().getName() + ",读文件共花了"
+ (calend.getTimeInMillis() - calstart.getTimeInMillis()) + "秒");
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} catch (InterruptedException e) {
e.printStackTrace();
}
} public static void main(String[] args) {
ReadFileLock threadTarget = new ReadFileLock();
Thread read = new Thread(threadTarget);
read.setName("thread-read-file");
read.start();
Thread read2 = new Thread(threadTarget);
read2.setName("thread-write-file2");
read2.start();
} }

  

NIO读写文件并加锁的更多相关文章

  1. php读写文件要加锁

    http://www.bubuko.com/infodetail-241753.html

  2. JAVA NIO之文件通道

    1.简介 通道是 Java NIO 的核心内容之一,在使用上,通道需和缓存类(ByteBuffer)配合完成读写等操作.与传统的流式 IO 中数据单向流动不同,通道中的数据可以双向流动.通道既可以读, ...

  3. java输入输出 -- java NIO之文件通道

    一.简介 通道是 Java NIO 的核心内容之一,在使用上,通道需和缓存类(ByteBuffer)配合完成读写等操作.与传统的流式 IO 中数据单向流动不同,通道中的数据可以双向流动.通道既可以读, ...

  4. php中并发读写文件冲突的解决方案

    在这里提供4种高并发读写文件的方案,各有优点,可以根据自己的情况解决php并发读写文件冲突的问题. 对于日IP不高或者说并发数不是很大的应用,一般不用考虑这些!用一般的文件操作方法完全没有问题.但如果 ...

  5. php中并发读写文件冲突的解决方案(文件锁应用示例)

    PHP(外文名: Hypertext Preprocessor,中文名:“超文本预处理器”)是一种通用开源脚本语言.语法吸收了C语言.Java和Perl的特点,入门门槛较低,易于学习,使用广泛,主要适 ...

  6. Java读写文件的几种方式

    自工作以后好久没有整理Java的基础知识了.趁有时间,整理一下Java文件操作的几种方式.无论哪种编程语言,文件读写操作时避免不了的一件事情,Java也不例外.Java读写文件一般是通过字节.字符和行 ...

  7. 【自学php】第三天 - 读写文件

    这次的例子是把订单的数据保存起来,一般是用数据库来进行数据的存储最好,但是今天目的是为了学习读写文件,所以这次把数据存在文件里. 读写文件有一般有三个步骤: 1)打开文件.如果文件不存在,需要先创建它 ...

  8. Java NIO 读取文件、写入文件、读取写入混合

    前言 Java NIO(new/inputstream outputstream)使用通道.缓冲来操作流,所以要深刻理解这些概念,尤其是,缓冲中的数据结构(当前位置(position).限制(limi ...

  9. 分享十:php中并发读写文件冲突的解决方案

    对于日IP不高或者说并发数不是很大的应用,一般不用考虑这些!用一般的文件操作方法完全没有问题.但如果并发高,在我们对文件进行读写操作时,很有可能多个进程对进一文件进行操作,如果这时不对文件的访问进行相 ...

随机推荐

  1. struts中的dojo控件sx:submit布局问题

    想在一个四列的表格中插入两个按钮,希望实现下面的布局效果: 其中保存按钮为<sx:submit />控件.按照下面的代码布局: <tr><td align="c ...

  2. Request.QueryString()和Request()和Request.Form();

    一. querystring的用法及原理 当页面上的 FORM以 GET方式向页面发送请求数据 (如数据含有不安全字符,则浏览器先将其转换成 16进制的字符再传送,如空格被转成 %20)时, WEB ...

  3. C#:单元测试(VS2015)

    根据VS2015的提示,仅支持在共有类或共有方法中支持创建单元测试.所以,如果我们要测试私有或是保护的类和方法,是要先将他们暂时设定成公有类型. 在VS2015中创建单元测试,只要在我们想测试的地方点 ...

  4. spring与activemq(三种消息监听方式)

    1.3     消息监听器MessageListener 在Spring整合JMS的应用中我们在定义消息监听器的时候一共可以定义三种类型的消息监听器,分别是MessageListener.Sessio ...

  5. windows10中git-bash闪退的解决办法

    windows10中git-bash闪退的解决办法 出现错误详情 Windows10 64位专业版安装git .18之后出现 Git闪退,报错信息:bash: /dev/null: No such d ...

  6. Thinkphp路由使用

    'URL_ROUTER_ON' => true, //开启路由 2.定义路由 'URL_ROUTE_RULES' => array( '/^c_(\d+)$/' => 'Index/ ...

  7. windows server core 设置shell 及切换

    hkey_local_machine/software/Microsoft/windows nt/currentversion/winlogon/shell 1)windows server 2012 ...

  8. 打开word文档总是自动弹出控件工具条的解决办法:

    打开word文档总是自动弹出控件工具条的解决办法:1.查看是否word文档和模板中了'apmp宏病毒,按ALT+F11组合键,双击当前文档下属的ThisDocument,清空里面的内容:双击Norma ...

  9. 【剑指offer】二进制中1的个数

    输入一个整数,输出该数二进制表示中1的个数.其中负数用补码表示. 思路:将原数字与1按位进行与操作. public class Solution { public int NumberOf1(int ...

  10. Python error: Microsoft Visual C++ 9.0 is required 解决方案

    换了新电脑,在使用python2.7 pip 安装ipython时,报错了 error: Microsoft Visual C++ 9.0 is required. Get it from http: ...