ZB-024-02-NIO

NIO (Java 7+)

  • New IO 新的IO
  • Non-blocking IO ⾮阻塞IO
  • NIO的Path - 就是旧版本的File
    • 它们之间可以转换
    • Path.toFile()
    • File.toPath()

关于NIO你仅仅需要了解 Files

比较有用的几个api

  • Files.walkFileTree
  • Files.readAllLines 不依赖第三方库的时候使用

NIO到底干什么的

经典的IO模型是基于流的

  • 就是你访问磁盘/网络的时候都是以的形式

它的优点是: 非常的直观,方便抽象 读 read / 写 write

它的缺点是: 慢,因为它是 流 就像一个水流,一个字节一个字节按顺序的读或写,严重限制了它的性能。

NIO模型是基于块的

好处是: 块和块之间没有顺序的,可以同时的写,比基于流的要快

还有一个原因就是 上篇文章里说的 CPU说:这个世界太慢了 所导致的 CPU和硬盘之间的矛盾

由于IO慢逼迫我们这样做

1.缓冲

  • buffer
  • cache
1
2
3
4
5
6
7
8
9
cpu往硬盘写一个文件
你有两个选择

1. 一个一个字节的写
这就导致了
写一个字节 等一个磁盘写入时间
再写一个字节 在等一个磁盘写入时间
循环往复
2. 攒一堆一块写, 比如缓冲区里是 1MB 攒够了一次写入磁盘

2.并发(多线程)

IO太慢了,怎么办?

  • BufferedReader/Writer
  • BufferedReader - ⼀次性读取好多东⻄到缓冲区⾥
  • BufferedWriter - ⼀次性写好多东⻄到缓冲区⾥
  • 在内存中创建好,⼀次写⼊

换⾏符的故事

  • windows 换行是 \r\n
  • linux 换行是 \n

导致文件从不同系统复制过来后显示会有问题

这个缓冲区到底是什么

  • 实际就是char cb[],它是在内存里的

其实……不需要重复发明轮⼦

  • 需要任何IO的功能,尽管搜索,肯定有⼈把轮⼦造好了。
    • FileUtils
    • IOUtils

练习