转载

万丈高楼平地起之Java基础四

1.JAVA中I/O流分类

  • 按照流的流向分,可以分为输入流和输出流;
    按照操作单元划分,可以划分为字节流和字符流;
    按照流的角色划分为节点流和处理流。复制代码

其实按照简单的输入、输出分成字符输入、字符输出、字节输入、字节输出四大父类,至于缓冲流、数据流、对象流都是在这四大类中变化。(值得注意是:输入输出是相对的,我们说的输入输出都是相对于程序而言,外部文件进入程序视为输入读,程序往内存操作视为输出写)

这篇文章中非常清楚的说明整个流的体系,请参考: github.com/Snailclimb/…

2.字符流和字节流的使用?

字节流用于输入输出非文本文件、字符流用于输入输出文本文件;为了提高输入输出效率,又配套产生了缓冲输入输出流,由于该流默认存在一个8192byte大小的缓冲区,在实现输入输出时,减少与磁盘的直接接触,cpu效率大大提升,总体而言会更加的快捷。

3.什么是管道流?

实现两个线程数据的交互,有四种管道流:PipedInputStream、PipedOutputStream、PipedReader和PipedWriter。这些流在两个正在运行的线程之间传递数据会非常有用。

注意:

管道流仅用于两个及以上个线程之间的数据交互,若用在同一个线程中可能会造成死锁;
管道流的输入输出是成对的,一个输出流只能对应一个输入流,使用构造函数或者connect函数进行连接;
一对管道流包含一个缓冲区,其默认值为1024个字节,若要改变缓冲区大小,可以使用带有参数的构造函数;
管道的读写操作是互相阻塞的,当缓冲区为空时,读操作阻塞;当缓冲区满时,写操作阻塞;
管道依附于线程,因此若线程结束,则虽然管道流对象还在,仍然会报错“read dead end”;
管道流的读取方法与普通流不同,只有输出流正确close时,输出流才能读到-1值。 复制代码

这篇文章中非常清楚说明管道流,请参考: blog.csdn.net/jijianshuai…

4.什么是I/O模型?

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模型的进一步了解将会在后文给出更详细的描述(如果还有后文的话)

5.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…

原文  https://juejin.im/post/5db44ee66fb9a020636997d4
正文到此结束
Loading...