*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;
}