按照流的流向分,可以分为输入流和输出流; 按照操作单元划分,可以划分为字节流和字符流; 按照流的角色划分为节点流和处理流。复制代码
其实按照简单的输入、输出分成字符输入、字符输出、字节输入、字节输出四大父类,至于缓冲流、数据流、对象流都是在这四大类中变化。(值得注意是:输入输出是相对的,我们说的输入输出都是相对于程序而言,外部文件进入程序视为输入读,程序往内存操作视为输出写)
这篇文章中非常清楚的说明整个流的体系,请参考: github.com/Snailclimb/…
字节流用于输入输出非文本文件、字符流用于输入输出文本文件;为了提高输入输出效率,又配套产生了缓冲输入输出流,由于该流默认存在一个8192byte大小的缓冲区,在实现输入输出时,减少与磁盘的直接接触,cpu效率大大提升,总体而言会更加的快捷。
实现两个线程数据的交互,有四种管道流:PipedInputStream、PipedOutputStream、PipedReader和PipedWriter。这些流在两个正在运行的线程之间传递数据会非常有用。
注意:
管道流仅用于两个及以上个线程之间的数据交互,若用在同一个线程中可能会造成死锁; 管道流的输入输出是成对的,一个输出流只能对应一个输入流,使用构造函数或者connect函数进行连接; 一对管道流包含一个缓冲区,其默认值为1024个字节,若要改变缓冲区大小,可以使用带有参数的构造函数; 管道的读写操作是互相阻塞的,当缓冲区为空时,读操作阻塞;当缓冲区满时,写操作阻塞; 管道依附于线程,因此若线程结束,则虽然管道流对象还在,仍然会报错“read dead end”; 管道流的读取方法与普通流不同,只有输出流正确close时,输出流才能读到-1值。 复制代码
这篇文章中非常清楚说明管道流,请参考: blog.csdn.net/jijianshuai…
BIO 模型:同步阻塞I/O模式,数据的读取写入必须阻塞在一个线程内等待其完成。当使用BIO模型进行Socket编程的时候,服务端通常使用while循环中调用accept方法,在没有客户端请求时,accept方法会一直阻塞,直到接收到请求并返回处理的相应,整个过程都是线性的,只有处理完当前的请求之后才会接受处理后面的请求,这样通常会导致通信线程被长时间阻塞。
NIO 模型 : 同步非阻塞的I/O模型,在Java 1.4 中引入了NIO框架,对应 java.nio 包,提供了 Channel , Selector,Buffer等抽象类。NIO中的N可以理解为Non-blocking,不单纯是New。
AIO 模型:异步非阻塞的IO模型,在 Java 7 中引入了 NIO 的改进版 NIO 2。异步 IO 是基于事件和回调机制实现的,也就是应用操作之后会直接返回,不会堵塞在那里,当后台处理完成,操作系统会通知相应的线程进行后续的操作。
关于I/O模型的进一步了解将会在后文给出更详细的描述(如果还有后文的话)
1.新建文件对象:
2.文件操作类型
3.对文件的具体操作
4.关闭文件
public void testFileReder() { FileReader fr = null; try { // File类的实例化 File file = new File("poety"); // FileReader实例化 fr = new FileReader(file); // 读入操作 char [] chars = new char[80]; int len ; if(( len =fr.read(chars))!= -1){ for (int i = 0; i <len ; i++) { System.out.print(chars [i]); } } } catch (IOException e) { e.printStackTrace(); } finally { try { // 关闭流 fr.close(); } catch (IOException e) { e.printStackTrace(); } } }复制代码
6.IO调优
磁盘IO优化
性能检测
1 我们可以压测应用,看看IO的wait指标是否正常。Linux下可以通过iostat查看IO状态; 2 IOPS是IO性能的重要参数,要看看最低的IOPS是多少; IOPS (Input/Output Operations Per Second),即每秒进行读写(I/O)操作的次数,多用于数据库等场合,衡量随机访问的性能。存储端的IOPS性能和主机端的IO是不同的,IOPS是指存储每秒可接受多少次主机发出的访问,主机的一次IO需要多次访问存储才可以完成。例如,主机写入一个最小的数据块,也要经过“发送写入请求、写入数据、收到写入确认”等三个步骤,也就是3个存储端访问。 3 RAID技术可以提升磁盘IO性能。每种RAID方案对IO性能提升不同,可以用raid因子来表示。复制代码
提升IO性能
1 增加缓存; 2 优化磁盘管理系统,寻址策略,非常底层; 3 设计索引,异步和非阻塞加快磁盘访问 4 使用raid.复制代码
1 raid0平均写到多个磁盘阵列,读写都是并行的,速度翻倍; 2 raid1实现了数据备份; 3 raid5是0和1的折中,平均读写,但是留一盘用来备份和恢复; 4 raid0+1.复制代码
TCP网络参数优化
1 端口号有65536个; 2 可用端口号不足时遇到大量并发请求时会成为瓶颈,大量请求等待建立连接; 如果出现大量time wait,可以设置timewait时间为更小值; 3 通过ab压测,发现time wait的连接很多,降低timeout时延,则timewait数量明显减少; 4 除了增大端口范围外,还可以让TCP连接复用等方式来提高性能。复制代码
网络IO优化 1
1 减少网络交互次数可以合并多个请求为一个请求 2 减少网络传输数据量大小压缩数据,尽量通过协议头来获取信息,设置使用代理时只判断协议头即可完成请求或者负载均衡。 3 尽量减少编码直接使用字节流传输,减少了一次解码过程 4 IO方式 复制代码
1 同步和异步同步就是前后任务依次完成,互相依赖,异步则不依赖其他任务; 2 阻塞和非阻塞阻塞和非阻塞主要和cpu有关,阻塞会切换cpu上下文,非阻塞则不会。复制代码
IO调优这一节内容来自于: 版权声明:本文为CSDN博主「黄小斜」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。 原文链接: blog.csdn.net/a724888/art…