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. HTTP/2协议–特性扫盲篇

    HTTP/2协议–特性扫盲篇 随着web技术的飞速发展,1999年制定的HTTP 1.1已经无法满足大家对性能的要求,Google推出协议SPDY,旨在解决HTTP 1.1中广为人知的性能问题.SPD ...

  2. 【shiro】(5)---基于Shiro的权限管理

    基于Shiro的权限管理项目搭建 前面写了四篇有关权限的文章,算是这篇文章的铺垫了.这篇文章采用 开发环境           JDK1.8          Eclipse          Mav ...

  3. .Net RabbitMQ系列之环境搭建于RabbitMQ基本介绍

    本系列主要讲解RabbitMQ在.Net环境下的应用,由于Linux环境下,本人Linux功力有限,所以本系列的RabbitMQ跑在Windows环境中.所以的配置之类都在Windows环境中进行. ...

  4. Python GUI之tkinter窗口视窗教程大集合(看这篇就够了)

    一.前言 由于本篇文章较长,所以下面给出内容目录方便跳转阅读,当然也可以用博客页面最右侧的文章目录导航栏进行跳转查阅. 一.前言 二.Tkinter 是什么 三.Tkinter 控件详细介绍 1. T ...

  5. 浅谈Mybatis连接原理

    众所周知数据库连接的过程,但是最近面试的人(菜面菜),都说用的SSM框架,但是我问了一下,mybatis是怎么连接上mysql的,基本上都会说:配置好的,直接用了,今天我来抛砖引玉一下,欢迎拍砖! 什 ...

  6. MySQL高可用新玩法之MGR+Consul

    前面的文章有提到过利用consul+mha实现mysql的高可用,以及利用consul+sentinel实现redis的高可用,具体的请查看:http://www.cnblogs.com/gomysq ...

  7. linux 命令 — 文件相关

    使用文件相关命令 dd 用来生成任意大小的文件 dd if=/dev/zero of=junk.data bs=1m count=1 生成一个1m大小的文件,里面全部使用0填充 if: 指定输入文件, ...

  8. linux 命令 — grep

    grep 用于文本搜索,能接受文件或者stdin作为输入,能输出各种格式 grep match_pattern filename 搜索文件中出现match_pattern的行,match_patter ...

  9. Jenkins入门之任务基本操作

    首先先简单讲一下Jenkins构建任务各种图标的含义 我的主界面有以下构建任务,这里前两列都是图标,第一列为构建的状态,前面已经讲过蓝色代表成功,红色代表失败.当然那是针对一次构建,一个构建任务可能有 ...

  10. HBase的java客户端测试(二)---DML操作

    测试准备 [首先同步时间:] for node in CloudDeskTop master01 master02 slave01 slave02 slave03;do ssh $node " ...