NIO - MappedByteBuffer

  *MappedByteBuffer的创建

  在FileChannel上调用map方法 返回一个MappedByteBuffer对象  

public MappedByteBuffer map(MapMode mode, long position, long size)
 
  MapMode  映射模式(MapMode 是FileChannel中的一个内部类) 有三个可选值

   1.READ_ONLY    只读映射模式

   2.READ_WRITE  读/写映射模式

   3.PRIVATE           通过put方法对MappedByteBuffer的修改   不会修改到磁盘文件  只是虚拟内存的修改

*MappedByteBuffer在父类ByteBuffer的基础上 新增的几个方法

   1.fore缓冲区在READ_WRITE模式下,此方法对缓冲区所做的内容更改强制写入文件
   2.load:将缓冲区的内容载入物理内存,并返回该缓冲区的引用
   3.isLoaded:判断缓冲区的内容是否在物理内存,如果在则返回true,否则返回false

private final static Charset charset = Charset.forName("GBK");  
	
	/**
	 * 读文件
	 * <br>------------------------------<br>
	 * @param path
	 * @return
	 * @throws IOException
	 */
	private static String read(String path) throws IOException {
		if (path == null || path.length() == 0) return null;
		FileInputStream fileInputStream =  new FileInputStream(path);
		FileChannel fileChannel =  fileInputStream.getChannel();
		MappedByteBuffer mappedByteBuffer = fileChannel.map(MapMode.READ_ONLY, 0, fileChannel.size());
		fileInputStream.close();
		fileChannel.close();
		String str = charset.decode(mappedByteBuffer).toString();
		mappedByteBuffer = null;
		return str;
	}
	
	/**
	 * 追加内容
	 * <br>------------------------------<br>
	 * @param path
	 * @param str
	 * @return
	 * @throws IOException
	 */
	private static MappedByteBuffer append(String path, String str) throws IOException {
		if (str == null || str.length() == 0) return null;
		RandomAccessFile randomAccessFile = new RandomAccessFile(path, "rw");
		FileChannel fileChannel = randomAccessFile.getChannel();
		byte[] bytes = str.getBytes();
		long size = fileChannel.size() + bytes.length;
		MappedByteBuffer mappedByteBuffer = fileChannel.map(MapMode.READ_WRITE, 0, size);
		fileChannel.close();
		randomAccessFile.close();
		
		int position = mappedByteBuffer.limit() - bytes.length;
		mappedByteBuffer.position(position);
		mappedByteBuffer.put(bytes);
		mappedByteBuffer.force();
		mappedByteBuffer.flip();
		return mappedByteBuffer;
	}
	
	/**
	 * 文件复制
	 * <br>------------------------------<br>
	 * @param srcfilePath
	 * @param targetPath
	 * @throws IOException 
	 */
	private static void copy(String srcfilePath, String targetPath) throws IOException { 
		File file = new File(targetPath);  
		if (!file.getParentFile().exists()) {  
			file.mkdirs();  
		}  
		RandomAccessFile inRandomAccessFile = new RandomAccessFile(srcfilePath, "r");
		FileChannel inFileChannel = inRandomAccessFile.getChannel();
		MappedByteBuffer inMappedByteBuffer = inFileChannel.map(MapMode.READ_ONLY, 0, inFileChannel.size());
		inRandomAccessFile.close();
		inFileChannel.close();
		
		RandomAccessFile outRandomAccessFile = new RandomAccessFile(targetPath, "rw");
		FileChannel outFileChannel = outRandomAccessFile.getChannel();
		MappedByteBuffer outMappedByteBuffer = outFileChannel.map(MapMode.READ_WRITE, 0, inMappedByteBuffer.capacity());
		outMappedByteBuffer.put(inMappedByteBuffer);
		outMappedByteBuffer.force();
		outRandomAccessFile.close();
		outFileChannel.close();
		outMappedByteBuffer.flip();
	}
	
	/**
	 * 不会更新到文件 只会更新虚拟内存 
	 * <br>------------------------------<br>
	 * @param path
	 * @param str
	 * @return
	 * @throws IOException
	 */
	private static MappedByteBuffer doTestPrivateMode(String path, String str) throws IOException {
		if (str == null || str.length() == 0) return null;
		RandomAccessFile randomAccessFile = new RandomAccessFile(path, "rw");
		FileChannel fileChannel = randomAccessFile.getChannel();
		byte[] bytes = str.getBytes();
		long size = fileChannel.size() + bytes.length;
		MappedByteBuffer mappedByteBuffer = fileChannel.map(MapMode.PRIVATE, 0, size);
		mappedByteBuffer.put(bytes);
		fileChannel.close();
		randomAccessFile.close();
		
		mappedByteBuffer.flip();
		System.out.println(charset.decode(mappedByteBuffer));
		return mappedByteBuffer;
	}


 

posted on 2012-06-03 13:47  YangJin  阅读(485)  评论(0编辑  收藏  举报