精通IO模型之路(二)--基于java的文件和网络IO
基于文件的java IO
java IO模型受限于操作系统
java的IO模型受限于操作系统,java程序跑起来,对Linux系统而言也是一个普通的系统,让我觉得很有意思的是java有个JVM,有自己管理的堆空间。对于java进程而言还有个直接内存Direct Memory。
在JDK1.4新加入了NIO,可以使用Native函数库直接分配堆外内存,有些场景避免了java堆和Native堆的来回复制从而提高性能。当然,不管是HeapByteBuffer还是DirectByteBuffer都逃不过系统调用的命运。
java.io将流分为了两类:
- 节点流:又称为低级流,是实际连接数据源与程序的"管道",负责实际搬运数据。读写一定是建立在节点流的基础上进行的。(文件流是典型的的节点流)
- 处理流:不能独立存在(没意义),必须连接在其他的流上,这样当数据"流经"当前流时,可以对这些数据做某种加工处理,简化我们对数据的加工操作
fos:FileOutputStream最终写到磁盘的是字节。每写一次调一次system call write()
osw:OutputStreamWriter转换流,java.io.Writer所有字符输出流的超类
bw:BufferedWriter带缓冲,减少system call,但是丢数据。
pw:PrintWriter自带刷新
使用若干高级流串联并最终连接到低级流上,对读写的数据做流水线式的加工处理,这样的操作称为流的连接,很精髓的东西。
基于网络的java IO
现在基本都用Netty了吧!东西多还零碎,以后再补充吧