nio

 

 一、字符集编码器和解码器

 

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()方法。

 

你可能感兴趣的:(nio)