美文网首页
java nio学习笔记(1)

java nio学习笔记(1)

作者: 捉虫大师 | 来源:发表于2018-08-14 23:27 被阅读8次

java nio即java new io,那么“旧io”有些什么内容呢?
java 旧io有这么几个重要的内容:

  • 流的概念,分为字符输入流(Reader),字符输出流(Writer),字节输入流(InputStream),字节输出流(OutputStream)
  • 文件,File和RandomAccessFile类

java nio有这么几个重要的内容:

  • Channel
  • Buffer
  • Selector

今天我们简单说一下channel,channel类似io中的流,但是有区别:

  • 通道可以读也可以写,流一般来说是单向的(只能读或者写,所以之前我 们用流进行IO操作的时候需要分别创建一个输入流和一个输出流);
  • 通道可以异步读写;
  • 通道总是基于缓冲区Buffer来读写。

几个重要channel的实现

  • FileChannel: 用于文件的数据读写
  • DatagramChannel: 用于UDP的数据读写
  • SocketChannel: 用于TCP的数据读写,一般是客户端实现
  • ServerSocketChannel: 允许我们监听TCP链接请求,每个请求会创建会一个SocketChannel,一般是服务器实现

我们先来写一个简单的从文件中读取数据到buffer中的例子:

package io;

import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.RandomAccessFile;
import java.nio.ByteBuffer;
import java.nio.CharBuffer;
import java.nio.channels.FileChannel;
import java.nio.charset.Charset;
import java.nio.charset.CharsetDecoder;

public class IoDemo {

    public static void main(String[] args) throws IOException {
        FileChannel channel = null;
        try {
            channel = new RandomAccessFile("/tmp/mock", "r").getChannel();
        } catch (FileNotFoundException e) {
            return;
        }
        ByteBuffer byteBuffer = ByteBuffer.allocate(1024);
        CharsetDecoder charsetDecoder = Charset.defaultCharset().newDecoder();

        while (channel.read(byteBuffer) != -1) {
            byteBuffer.flip();
            CharBuffer charBuffer = charsetDecoder.decode(byteBuffer);
            System.out.println(charBuffer.toString());
            byteBuffer.clear();
        }
    }
}

在之前的文章《高并发下原子操作与主从延迟下的锁的思考》中实现的文件锁就是基于FileChannel来实现的(代码在这里)。看源码会发现这个lock底层是native实现的,是可以进程也可以线程间使用(依赖操作系统)。

channel中还有个重要的东西是内存映射文件

内存的访问速度比磁盘高几个数量级,但是基本的IO操作是直接调用native方法获得驱动和磁盘交互的,IO速度限制在磁盘速度上
由此,就有了缓存的思想,将磁盘内容预先缓存在内存上,这样当供大于求的时候IO速度基本就是以内存的访问速度为主;
而我们知道大多数OS都可以利用虚拟内存实现将一个文件或者文件的一部分映射到内存中,然后,这个文件就可以当作是内存数组一样地访问,我们可以把它看成一种“永久的缓存”;
内存映射文件:内存映射文件允许我们创建和修改那些因为太大而不能放入内存的文件,此时就可以假定整个文件都放在内存中,而且可以完全把它当成非常大的数组来访问(随机访问)

今天有些累,就写这些概念,下次再分析。

相关文章

网友评论

      本文标题:java nio学习笔记(1)

      本文链接:https://www.haomeiwen.com/subject/upbbbftx.html