package com.io;
import java.io.*;
import java.nio.channels.FileLock;
import java.util.concurrent.TimeUnit;
public class FileLocking {
/**
* 文件加锁,Java的文件加锁直接映射到了本地操作系统的加锁工具
* @throws FileNotFoundException
* @throws Exception
*/
public static void main(String[] args) throws FileNotFoundException, Exception {
FileOutputStream fos=writeFile("file.txt");
try {
FileLock fl=fos.getChannel().tryLock();
System.out.println(fl.isShared());
if(fl!=null){
System.out.println("Lock file:");
//TimeUnit 表示给定单元粒度的时间段,它提供在这些单元中进行跨单元转换和执行计时及延迟操作的实用工具方法。
TimeUnit.MILLISECONDS.sleep(100);
fl.release();
System.out.println("Released lock");
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
fos.close();
}
public static FileOutputStream writeFile(String filename){
FileOutputStream fos=null;
try {
fos=new FileOutputStream(filename);
PrintStream ps=new PrintStream(fos);
ps.println("面朝大海春暖花开");
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return fos;
}
}
package com.io;
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 FileChannel fc;
static final int LENGTH=0x8FFFFFF;
public static void main(String[] args) throws IOException {
fc=new RandomAccessFile("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);
}
private static class LockAndModify extends Thread{
private ByteBuffer buff;
private int start,end;
public 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.tryLock(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("Released : "+start+" to"+end);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}