Java工具包之轻松理解Java中的IO与NIO( 二 )


Java NIO 核心API
Java NIO 中Channel,Buffer 和 Selector 构成了核心的API 。
Channel
Channel(通道)和IO中的流是差不多一个等级的 。只不过流是单向的,譬如:InputStream, OutputStream.而Channel是双向的,既可以用来进行读操作,又可以用来进行写操作 。
NIO中的Channel的主要实现有:

  • FileChannel
  • DatagramChannel
  • SocketChannel
  • ServerSocketChannel

分别可以对应文件IO、UDP和TCP(Server和Client) 。
Buffer
NIO中的关键Buffer实现有:ByteBuffer, CharBuffer, DoubleBuffer, FloatBuffer, IntBuffer, LongBuffer, ShortBuffer,分别对应基本数据类型: byte, char, double, float, int, long, short 。
选择器(Selectors)
Java NIO的选择器允许一个单独的线程来监视多个输入通道,你可以注册多个通道使用一个选择器,然后使用一个单独的线程来“选择”通道:这些通道里已经有可以处理的输入,或者选择已准备写入的通道 。这种选择机制,使得一个单独的线程很容易来管理多个通道 。
实例代码五:
//使用NOI输出public static void inputNIOChannel() throws IOException {//创建一个File实例File file = new File("/home/wenhaibo/IOTest.txt");//FileInputStream为文件输入流FileInputStream in = new FileInputStream(file);//缓冲器向通道输入数据FileChannel fileChannel = in.getChannel();//创建一个容量为1024字节的ByteBufferByteBuffer buf = ByteBuffer.allocate(1024);//写入数据到Bufferint bytesRead = fileChannel.read(buf);while(bytesRead != -1){//回绕缓冲区(输出通道会从数据的开头而不是末尾开始)buf.flip();while(buf.hasRemaining()){System.out.print((char)buf.get());}/*** 压缩此缓冲区,compact方法会执行两个动作* 1.清除之前写好的字符* 2.通过标记位置为0* 这就为什么要结合filp()使用*/buf.compact();//写入数据到BufferbytesRead = fileChannel.read(buf);}}实际应用中在不考虑并发和读取/写入数据使用频率比较高的情况下Java IO已经可以胜任,但在使用到网络IO中Java IO已经不能满足实际需求,Java NIO 无疑是更好的选择 。




推荐阅读