java 内存储器映射文件 大文件操作
java 内存映射文件 大文件操作
/** * 内存映射文件 * @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(); } } } }