IO中的几种形式
基于字节:InputStream、OutputStream
基于字符:Writer、Reader
基于磁盘:File
基于网络Socket
 
最终都是字节操作,字符到字节要编码转换。耗时,容易乱码
 
1,磁盘IO
磁盘设置,应用程序只能系统调用,要内核空间和用户空间切换,
标准访问文件:
读取为例,先读到内核空间,再读到用户空间。
另外有直接IO,系统缓存一下,直接从缓存读
同步,异步,内存映射(内核空间映射到用户空间减少复制操作)
 
2,网络IO
Socket是抽象概念,也是字节流
 
3,NIO
主要是信道和选择器。传统IO访问竞争资源要同步,产生阻塞
NIO一个线程监听客户端请求,阻塞方式执行。另外一个线程负责处理请求用NIO
tomcat的NIO
<Connector port="8080" protocol="org.apache.coyote.http11.Http11NioProtocol"
可以看出在处理动态资源时NIO的优势并不明显甚至还不如IO,其主要原因是动态资源,是IO和cpu密集型操作,导致很多请求都阻塞在CPU和IO上,所以socket IO只能干等着,发挥不出NIO的优势

再看处理静态时NIO的表现,虽然不稳定但性能的提升还是很明显的,所以NIO常常用来处理请求多并且处理起来比较简单的应用中,如memcached,NIO的方式连接redis也能提升并发数

 
FileChannel
把文件映射到内存区域,省去了内核空间复制到用户空间的损耗
 
 
4,IO调优
 
磁盘:增加缓存,减少磁盘访问次数
 
TCP网络:TCP连接复用,增加端口范围
减少网络交互次数、传输数据量、减少编码(转化成字节再发送)
注意动态资源NIO,不明显,静态资源更适合
 
5,相关的设计模式:
 
适配器模式,改变接口来重复使用
把一个类的接口变成客户端能接受的另一种接口。
使两个接口不一样的类能一起工作。
InputStreamReader适配器实现了Reader接口,持有InputStream引用。这样Reader字节最终调用InputStream
InputStreamReader:对象+接口
 
装饰器模式,接口不变,增强原来对象的功能
赋予类更多的功能,
FileInputStream,
BufferedInputStream是具体实现者,把InputStream读取内容保存在内存中,增强了功能。
 
抽象组件:InputStream
装饰器FileInputStream:实现了InputStream所有接口,持有InputStream引用
实现者BufferedInputStream:把InputStream读取内容保存在内存中,增强了功能。

1,理解java中的IO的更多相关文章

  1. 深入理解Java中的IO

    深入理解Java中的IO 引言:     对程序语言的设计者来说,创建一个好的输入/输出(I/O)系统是一项艰难的任务 < Thinking in Java >   本文的目录视图如下: ...

  2. java中的io系统详解 - ilibaba的专栏 - 博客频道 - CSDN.NET

    java中的io系统详解 - ilibaba的专栏 - 博客频道 - CSDN.NET 亲,“社区之星”已经一周岁了!      社区福利快来领取免费参加MDCC大会机会哦    Tag功能介绍—我们 ...

  3. java中的IO操作总结

    一.InputStream重用技巧(利用ByteArrayOutputStream) 对同一个InputStream对象进行使用多次. 比如,客户端从服务器获取数据 ,利用HttpURLConnect ...

  4. [译]线程生命周期-理解Java中的线程状态

    线程生命周期-理解Java中的线程状态 在多线程编程环境下,理解线程生命周期和线程状态非常重要. 在上一篇教程中,我们已经学习了如何创建java线程:实现Runnable接口或者成为Thread的子类 ...

  5. Java 中的 IO 与 socket 编程 [ 复习 ]

    一.Unix IO 与 IPC Unix IO:Open-Read or Write-Close IPC:open socket - receive and send to socket - clos ...

  6. Java中的IO

    引言:     对程序语言的设计者来说,创建一个好的输入/输出(I/O)系统是一项艰难的任务 < Thinking in Java >   本文的目录视图如下:   Java IO概要 a ...

  7. JDK学习---深入理解java中的HashMap、HashSet底层实现

    本文参考资料: 1.<大话数据结构> 2.http://www.cnblogs.com/dassmeta/p/5338955.html 3.http://www.cnblogs.com/d ...

  8. Java NIO学习系列六:Java中的IO模型

    前文中我们总结了linux系统中的5中IO模型,并且着重介绍了其中的4种IO模型: 阻塞I/O(blocking IO) 非阻塞I/O(nonblocking IO) I/O多路复用(IO multi ...

  9. Java NIO之Java中的IO分类

    前言 前面两篇文章(Java NIO之理解I/O模型(一).Java NIO之理解I/O模型(二))介绍了,IO的机制,以及几种IO模型的内容,还有涉及到的设计模式.这次要写一些更贴近实际一些的内容了 ...

随机推荐

  1. ACM-ICPC (10/15) Codeforces Round #440 (Div. 2, based on Technocup 2018 Elimination Round 2)

    A. Search for Pretty Integers You are given two lists of non-zero digits. Let's call an integer pret ...

  2. HDU 2157 How many ways?? 【矩阵经典8】

    任意门:http://acm.hdu.edu.cn/showproblem.php?pid=2157 How many ways?? Time Limit: 2000/1000 MS (Java/Ot ...

  3. SignalR中的依赖注入

    什么是依赖注入? 如果你已经熟悉依赖注入可以跳过此节. 依赖注入 (DI) 模式下,对象并不为自身的依赖负责. 下边的例子是一个主动 DI. 假设你有个对象需要消息日志.你可能定义了一个日志接口: C ...

  4. Redis的安装+哨兵模式+集群

    Redis安装(基于2.8版本) 哨兵(Sentinel集群)模式: 集群(基于3.0+)

  5. AngularJS 二 指令介绍

    初始化AngularJS框架 ng-app指令: 在NG-程序指令是AngularJS应用程序的起点.它自动初始化AngularJS框架.AngularJS框架将在加载整个文档之后首先检查HTML文档 ...

  6. 整理下react中常见的坑

    其实有些也不能算是坑,有些是react的规定,或者是react的模式和平常的js处理的方式不同罢了 1.setState()是异步的this.setState()会调用render方法,但并不会立即改 ...

  7. Unity 游戏框架搭建 (十四) 优雅的QSignleton(零) QuickStart

      好久不见 !之前想着让各位直接用QFramework,但是后来想想,如果正在进行的项目直接使用QFramework,这样风险太高了,要改的代码太多,所以打算陆续独立出来一些工具和模块,允许各位一个 ...

  8. rank() over,dense_rank() over,row_number() over的区别

    rank() over,dense_rank() over,row_number() over的区别 1.rank() over:查出指定条件后的进行排名.特点是,加入是对学生排名,使用这个函数,成绩 ...

  9. 伪造Http请求IP地址

    注意:伪造Http请求IP地址一般为非推荐使用手段 一般使用:简单投票网站重复投票,黑别人网站 在项目开发中(web项目),我负责的系统(简称PC),需要调其它系统接口,并且该系统需要获取客户端(浏览 ...

  10. 查看系统PCI设备

    # lspci Host bridge:主板 VGA compatible controller:VGA显卡设备 Class 0403:声卡设备 USB Controller:USB接口设备 SATA ...