• java 1.4 以后推出了nio 极大的优化了java 的io性能

之前java bio的做法

 /**
     * 不实用缓冲流的方式
     */
    public static void bioIO(String param) throws IOException {
        File file = new File("/Users/llw/Desktop/111.txt");
        OutputStream outputStream = new FileOutputStream(file);
        for (int i = 0; i < 40000000; i++) {
            outputStream.write(param.getBytes(StandardCharsets.UTF_8));
        }
        outputStream.close();
    }

    /**
     * 使用缓冲流
     */
    public static void bioBufferIO(String param) throws IOException {
        File file = new File("/Users/llw/Desktop/222.txt");
       var outputStream =  new BufferedOutputStream(new FileOutputStream(file));
        for (int i = 0; i < 400000000; i++) {
            outputStream.write(param.getBytes(StandardCharsets.UTF_8));
        }
        outputStream.close();
    }

对比两种方法

  • bioIO每次write 都会进行写磁盘操作,都会经历从用户态到内核态的数据刷写,所以效率很低。
  • bioBufferIO 会默认先写到缓冲区,不会马上写到磁盘上,等到达到了8k,统一写到磁盘上。

使用nio

  • nio的优势为可以随便移动文件读/写的位置,适合做日志追加/操作大文件等操作。

RandomAccessFile

  • RandomAccessFile既可以读文件,也可以写文件,所以类似于InputStream的read()方法,以及类似于OutputStream的write()方法,RandomAccessFile都具备。除此之外,RandomAccessFile具备两个特有的方法,来支持其随机访问的特性。RandomAccessFile对象包含了一个记录指针,用以标识当前读写处的位置,当程序新创建一个RandomAccessFile对象时,该对象的文件指针记录位于文件头(也就是0处),当读/写了n个字节后,文件记录指针将会后移n个字节。除此之外,RandomAccessFile还可以自由移动该记录指针。下面就是RandomAccessFile具有的两个特殊方法,来操作记录指针,实现随机访问。
long getFilePointer( ):返回文件记录指针的当前位置
void seek(long pos ):将文件指针定位到pos位置

c10k问题