/**
* 内存映射文件
* @author Administrator
*
*/
public class LargeMappedFiles {
private static int length = 0x8FFFFFF;
public static void main(String args[]) {
try {
MappedByteBuffer out = new RandomAccessFile(new File("D:\\Niotest.txt"), "rw")
.getChannel()
.map(FileChannel.MapMode.READ_WRITE, 0, length);
for(int i = 0; i < length;i++){
out.put((byte)'x');
}
System.out.println("Finished writing");
for(int i = length/2;i<length/2+6;i++){
System.out.println((char)out.get(i));
}
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
}
内存映射文件上锁和部分内容上锁
/**
* 文件映射 针对大文件
* 大文件部分文件加锁
* @author Administrator
*
*/
public class LockingMappedFiles {
static FileChannel fc;
static final int LENGTH = 0x8FFFFFF;
public static void main(String args[]){
try {
fc = new RandomAccessFile("D:\\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) {
e.printStackTrace();
} catch (IOException e) {
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 (IOException e) {
e.printStackTrace();
}
}
}
}