陆小曼|Java IO,讲的实在是太好了,这篇( 六 )


还有其它一些额外的方法 , 与字节输入流基类提供的方法是相同的 , 只是作用的对象不再是字节 , 而是字符 。
重要方法方法功能publicvoidwrite(charcbuf[])将cbuf字符数组写出到输出流abstractpublicvoidwrite(charcbuf[],intoff,intlen)将指定范围的cbuf字符数组写出到输出流publicvoidwrite(Stringstr)将字符串str写出到输出流 , str内部也是字符数组publicvoidwrite(Stringstr,intoff,intlen)将字符串str的某一部分写出到输出流abstractpublicvoidflush()刷新 , 如果数据保存在缓冲区 , 调用该方法才会真正写出到指定位置abstractpublicvoidclose()关闭流对象 , 每次IO执行完毕后都需要关闭流对象 , 释放系统资源
所以Java提供了两种转换流:
InputStreamReader:从字节流转换为字符流 , 将字节数据转换为字符数据读入到内存OutputStreamWriter:从字符流转换为字节流 , 将字符数据转换为字节数据写出到指定位置了解了Java传统的BIO中字符流和字节流的主要成员之后 , 至少要掌握以下两个关键点:
(1)传统的BIO是以流为基本单位处理数据的 , 想象成水流 , 一点点地传输字节数据 , IO流传输的过程永远是以字节形式传输 。
(2)字节流和字符流的区别在于操作的数据单位不相同 , 字符流是通过将字节数据通过字符集映射成对应的字符 , 字符流本质上也是字节流 。
接下来我们再继续学习NIO知识 , NIO是当下非常火热的一种IO工作方式 , 它能够解决传统BIO的痛点:阻塞 。
BIO如果遇到IO阻塞时 , 线程将会被挂起 , 直到IO完成后才唤醒线程 , 线程切换带来了额外的开销 。 BIO中每个IO都需要有对应的一个线程去专门处理该次IO请求 , 会让服务器的压力迅速提高 。我们希望做到的是当线程等待IO完成时能够去完成其它事情 , 当IO完成时线程可以回来继续处理IO相关操作 , 不必干干的坐等IO完成 。 在IO处理的过程中 , 能够有一个专门的线程负责监听这些IO操作 , 通知服务器该如何操作 。 所以 , 我们聊到IO , 不得不去接触NIO这一块硬骨头 。