一、字符集编码器和解码器
Charset charset= Charset.forName("ISO-8859-1");
// Unicode转编码
String str = . . .;
ByteBuffer buffer = charset.encode(str);
byte[] bytes = buffer.array();
//编码转Unicode
byte[] bytes = . . .;
ByteBuffer buffer = ByteBuffer.wrap(bytes, offset, length);
CharBuffer cbuf = charset.decode(buffer);
String str = cbuf.toString();
二、非阻塞I/O
三、内存映射文件
通道(channel):通道是用于磁盘文件的一种抽象,它使我们可以访问诸如内存映射、文件加锁机制以及文件间快速数据传递等操作系统的特性。
FileChannel.map(MapMode mode, ...) 方法从这个通道中获得一个MappedByteBuffer,有三种模式:
- FileChannel.MapMode.READ_ONLY:缓冲区只读,写入会导致ReadOnlyBufferException;
- FileChannel.MapMode.READ_WRITE:缓冲区可写,修改会在某个时刻写回到文件;
- FileChannel.MapMode.PRIVATE:缓冲区可写,但是修改对缓冲区私有,不会传播到文件中。
有了缓冲区,可以使用ByteBuffer类和Buffer超类的方法读写数据。
缓冲区支持顺序和随机数据访问。
Buffer最常用的子类ByteBuffer和CharBuffer。每个缓冲区都具有:
- 一个容器,它永远不能改变。
- 一个读写位置,下一个值将在此进行读写。
- 一个界限,超过它进行读写是没有意义的。
- 一个可选的标记,用于重复一个读入或写出操作。
0 <= 标记 <= 位置 <= 界限 <= 容量
四、文件加锁机制
文件锁可以控制对文件或文件中某个范围的字节的访问,文件加锁机制在不同的操作系统之间变化很大。
FileChannel的lock()会阻塞直至可获得FileLock锁;
trylock()将立即返回,要么返回锁,要么在锁不可获得的情况下返回null。
这个文件将保持锁定状态,直至这个通道关闭,或者在锁上调用release()方法。