java I/O 的基本架构:

1:基于字节操作的I/O接口 InputStream OutputStream
2:基于字符操作的I/O接口 Writer 和Reader
3:基于磁盘操作的I/O接口 File
4:基于网络操作的I/O接口 Socket
 
12为数据传输的格式
34为数据传输的方式
 
123位于java.io包中其中包含了大概80个类
 
对于1:基于字节·InputStream OutputStream。
1:操作数据的方式可以组合使用;
2:必须指定流文件写到网络中还是磁盘中;
对于2:基于字符 ·Write Reader
1:之规定了字符读写的方式
2:实现的函数:write (char cb-uf[], int off ,int len);
reader(char cbuf[], int off, int ;len );
对于12,字符字节之间的转化
1:字节转字符 InputStreamReeader()
2: 字符转字节 OutputStreamWriter()
 
对于三:磁盘I/O工作机制
访问文件包含的空间:
1:磁盘
2:内核空间
3:用户空间
4: 缓存
工作流程:应用程序访问磁盘空间,需要经过系统的write 和 read 调用来;系统为了安全,会将内核程序和用户程序之间隔离从而产生内核空间和用户空间;
1:标准访问文件的方式:
读取:read接口先在内核空间中搜索,没有则从磁盘中读取;
写入:write接口将数据从用户复制到内核,写磁盘是异步的,除非调用sync同步命令;
2:直接I/O方式:
读写都是直接通过用户空间的缓存来进行,可以做到预加载了,提高访问速度,如果访问的数据没有在应用程序缓存中,将会很慢;
3: 同步访问文件的方式:
性能较差,只用当文件全部读写完成,才会返回给应用程序成功的标志;
4:异步访问文件的方式:
发出处理文件的线程之后,不会出现阻塞等待,提高了应用程序的效率,文件读写的效率并没有提高;
5:内存映射的方式:
将内存中的某一区域和磁盘中的文件关联起来,访问内存中的一段数据时,转换为访问文件的数据,减少从内核空间缓存到用户空间缓存的数据复制操作;
 
java序列化技术:继承java.io.Serializable接口;将一个对象转化成一串二进制表示的字节数组,通过保存或传义这些字节数据来达到持久化的目的。
序列化情况的总结:1:父类继承Serializable接口,子类都可以被序列化
2:子列实现了Seriializable接口,父类没有,父类中的属性不能序列化,单子类中属性仍能正确序列化。
3:序列化的属性是对象,对象必须实现Serializable接口;
4:反序列化,如果对象的属性有修改或者删减,则修改的部分属性会丢失,但不会报错;
5:反序列化时,如果serialVersionUID被修改,反序列化会失败;
 
四:网络I/O的工作机制;
TCP的是十一种状态:
1:CLOSED :起始点,在连接关闭或超时的时候变成此状态
2:LISTEN : 监听来自网络节点上其他主机的TCP端口连接请求,服务端需要调用socket, bind,listen函数,就进入此状态。此称为应用程序被动打开(等待客户端来连接)
3:SYN_RCVD :服务器接收到来自客户端的连接请求(发送一个SYN分节),服务器端tcp状态就由LISTEN- > SYN_4:RCVD,服务器端发送ACK和SYN,或者客户端在发起SYN的同时接收到服务器端的SYN,客户端就会SYN_SENT -> SYN_RCVD。
5:SYN_SETN:客户端发起连接,发送SYN给服务器端。如果服务器端不能连接(应用关闭;或超时),则直接进入CLOSED状态。具体行为是发起一个SYN连接请求
6:ESTABLISHED:总体说来,客户端和服务器端在完成三路握手后,两者最终进入的状态,表示连接已经建立成功,可以传送数据了。对于服务器端来说,就是在SYN_RCVD状态时,收到了来自客户端的ACK。于是SYN_RCVD->ESTA7:BLISHED;对于客户端来说,就是在SYN_SENT状态时,收到了来自服务器端的SYN+ACK分节,状态从SYN_SENT->ESTABLISHED,然后发送ACK
8:FIN_WAIT_1:主动关闭的一方(发送FIN的那方)从ESTABLISHED -> FIN_WAIT_1
9:FIN_WAIT_2:主动关闭的一方,接收到对方的FIN ACK,进入此状态。由此不能再接收对方的数据。但是能够向对方发送数据(此句话很重要)
10:PCLOSE_WAIT:接收到FIN以后,被动关闭的一方进入此状态。具体动作时接收到FIN,同时发送ACK。为了便于记忆,大家可以这么想,TCP终止中,接收到了FIN的被动关闭方发送ACK后,过会还要发送FIN表示自己也要关闭了,中间的这段就可以叫做CLOSE_WAIT(等待关闭)
LAST_ACK:,被动方发送FIN,导致CLOSE_WAIT -> LAST_ACK,TCP终止则还需要等待最后一个ACK,所以状态叫做LAST_ACK,等到最后ACK后,LAST_ACK ->CLOSED
11: CLOSING:主动关闭方处于FIN_WAIT_1状态时,接收FIN,则从FIN_WAIT_1 -> CLOSING
影响网络传输的因素:网络带宽,传输距离,TCP拥塞控制
 
 
建立通信链路Socket:位于TCP/UDP之上,包含本机地址,远程地址,端口套接字,经历完TCP三次握手协议,之后建立;
网络数据传输时,两端同时发送数据,会出现死锁,通过NIO工作机制,可以避免。NIO机制通过引入:Channel Buffer Selector 来处理解决;
 
 
设计模式解析之适配器模式:
Tareget(目标接口):所要转换的所期待的接口;
Adaptee(源角色):需要适配的接口;
Adapter(适配器):将源接口是配成目标接口,继承源接口,实现目标接口;
设计模式解析之装饰器模式:
Component:定义抽象接口,规定被装饰组件的功能;
ConcreteComponent:实现抽象组件的所有功能;
Decorator:装饰器角色
 
 

java I/O工作机制的更多相关文章

  1. 2 深入分析 Java IO的工作机制(一)

    大部分Web应用系统的瓶颈都是I/O瓶颈 2.1 Java的I/O类库的基本架构 Java的I/O操作类在包java.io下,大概有将近80个类,这些类大概可以分成如下4组. 基于字节操作的I/O接口 ...

  2. 深入分析Java I/O 工作机制

    前言 :  I/O 问题是Web 应用中所面临的主要问题之一.而且是任何编程语言都无法回避的问题,是整个人机交互的核心. java 的I/O类操作在java.io 包下,将近80个子类, 大概可以分成 ...

  3. Java I/O 工作机制(一) —— Java 的 I/O 类库的基本架构

    Java 的 I/O 类库的基本架构 Java 的 I/O 操作类在包 java.io 下,有将近 80 个类. 按数据格式分类: 面向字节(Byte)操作的 I/O 接口:InputStream 和 ...

  4. Java I/O 工作机制(二) —— Java 的 I/O 的交互方式分析

    简介: BIO:同步阻塞式IO,服务器实现模式为一个连接一个线程,即客户端有连接请求时服务器端就需要启动一个线程进行处理,如果这个连接不做任何事情会造成不必要的线程开销,当然可以通过线程池机制改善.  ...

  5. Java Web ClassLoader工作机制

    一.ClassLoader的作用: 1.类加载机制:父优先的等级加载机制 2.类加载过程 3.将Class字节码重新解析成JVM统一要求的对象格式 二.ClassLoader常用方法 1.define ...

  6. Java Socket 的工作机制

    转载,请加上原文链接: 目录 socket 对象的创建时间 socket 通信可能会造成死锁 socket 对象的创建时间 这里需要一点TCP的知识, TCP状态分析请看 --> TCP转态转换 ...

  7. 2 深入分析 Java IO的工作机制(二)

    2.5 I/O调优 下面总结一些磁盘I/O和网络I/O的常用优化技巧. 2.5.1 磁盘I/O优化 1. 性能检测 应用程序通常都需要访问磁盘来读取数据,而磁盘I/O通常都很耗时,要判断I/O是否是一 ...

  8. 深入分析 Java I/O 的工作机制--转载

    Java 的 I/O 类库的基本架构 I/O 问题是任何编程语言都无法回避的问题,可以说 I/O 问题是整个人机交互的核心问题,因为 I/O 是机器获取和交换信息的主要渠道.在当今这个数据大爆炸时代, ...

  9. 深入分析 Java I/O 的工作机制

    I/O 问题可以说是当今互联网 Web 应用中所面临的主要问题之一,因为当前在这个海量数据时代,数据在网络中随处流动.这个流动的过程中都涉及到 I/O 问题,可以说大部分 Web 应用系统的瓶颈都是 ...

随机推荐

  1. ImportError: No module named '_tkinter', please install the python3-tk package

    ImportError: No module named '_tkinter', please install the python3-tk package 先更新包,命令:sudo apt-get ...

  2. mysql 开发基础系列12 选择合适的数据类型(上)

    一. char 与varchar比较 在上图的最后一行的值只适用在"非严格模式",关于严格模式后面讲到.在“开发基础系列4“ 中讲到CHAR 列删除了尾部的空格.由于char是固定 ...

  3. Spring Boot Jersey使用示例

    前言 本文将学习如何使用Spring Boot和Jersey框架,去配置和创建JAX-RS 2.0 REST API接口: 这个示例应用使用的是Jersey的Servlet容器去部署REST API接 ...

  4. shell运算符与流程控制-2

    1.shell运算符 1.1.算数运算符 原生的bash不支持算数运算,可以通过其它方式实现例如expr. `expr a + b` #a b为数字,和运算符之间要有空格 #``不是单引号,为键盘上E ...

  5. [CXF REST标准实战系列] 一、JAXB xml与javaBean的转换

    Writer:BYSocket(泥沙砖瓦浆木匠) 微博:BYSocket 豆瓣:BYSocket Reprint it anywhere u want. 文章Points: 1.不认识到犯错,然后得到 ...

  6. 提升 PLSQL 开发性能漫谈

    本文内容摘自<剑破冰山--Oracle开发艺术>一书,有删改. 1.触发器尽量考虑内部代码过程封装(解析次数) 2.避免动态 SQL 动态 SQL 和普通 SQL 在执行过程中最大的差别在 ...

  7. Mycat - 高可用与负载均衡实现,满满的干货!

    前言 开心一刻 和朋友去吃小龙虾,隔壁桌一个小女孩问妈妈:"妈妈,小龙虾回不了家,它妈妈会不会着急?" 她妈妈愣住了,我扒虾的手停下了,这么善良的问题,怎么下得了口.这是老板急忙过 ...

  8. [转]Node.JS使用Sequelize操作MySQL

    Sequelize官方文档  https://sequelize.readthedocs.io/en/latest/ 本文转自:https://www.jianshu.com/p/797e10fe23 ...

  9. JSTL_Format标记库

    JSTL_Format 一:JSTL Format标记库 如有转载,请标明出处 介绍标记属性的时候,按照顺序必须写的->带有默认值的->其他的,中间用回车隔开 在jsp问价开头加上 < ...

  10. nginx配置虚拟机

    在/usr/local/nginx/conf目录下nginx.conf文件是nginx的配置文件. 一.通过端口号区分虚拟机 在nginx.conf文件中添加一个Service节点,修改端口号: se ...