图学java基础篇之IO
java io体系

如图可以看出,java的io按照包来划分的话可以分为三大块:io、nio、aio,但是从使用角度来看,这三块其实揉杂在一起的,下边我们先来概述下这三块:
- io:主要包含字符流和字节流,我们常用的文件读写,流处理等都要用到,也是本次介绍的重点。jdk1.7之后的io底层部分类经已改为使用阻塞的nio实现了
- nio:jdk1.4后加入,多路非阻塞(多路IO复用模型),此外还实现了buffer、channel、selector、内存映射文件等实现。我们直接使用nio多数情况用于网路编程。
- aio:jdk1.7支持,又叫做nio2,实现了异步非阻塞io。较nio更高效,也主要用于网络编程。
由于本次主要介绍java基本的io类结构,io类的实现相对简单(主要是字节或者字符数组的操作),而nio和aio更多时候我们关注的是网络编程,要想理解需要对unix网络模型、异步和阻塞等有比较清晰的理解,因此并不会花大量篇幅介绍各个类,示例也仅会给出链接。
快写完的时候看到的一篇,写的赞,果然水平还差的远:深入分析 Java I/O 的工作机制
io类结构

常用的类不在介绍,下边主要介绍一些有特殊功能的类
PipedWriter,PipedReader
管道输入流,熟悉linux系统应该看到pipe应该就明白了,可以实现线程间通信,需要和PipedReader配套使用。详解和示例
FilterReader,FilterWriter
根据名字也能看出来,目的事项实现一个流过滤器,但是你会发现其实是个抽象类,并没有实现,这里只是提供了接口。扫了一下发现jdk里边只有Utility的一个JavaWriter的静态类实现了,其功能是将字节转换成有效的java字符。
CharArrayReader,CharArrayWriter
将字节数组作为输入或输出流处理,一般作为中间值,用来将字符数组和其他IO字符处理类转换。下边的ByteArrayInputStream与此类似,不过处理的是字节数组。详解和示例
PushbackReader,PushbackInputStream
具有回推功能的IO处理类,可以将已读取过的数据再回推到缓冲区中,重复读取(注意一般的流都是单向的,一旦读取出来就不能再读了)。详解和示例
DataInputStream,DataOutputStream
提供了按照类型或编码读取写入文件的方法,如byte[]、int、short、char、byte、UTF等类型或编码的读写。详解和示例
SequenceInputStream
如其名字:顺序输入流,改类允许将多个输入流作为输入,并按照顺序处理多个流,使用的时候当做一个流处理。详解和示例
RandomAccessFile
该类与其他IO类有较大不同,其支持随机读写,对于格式化的记录文件读取很有优势。此外由于其底层的操作已经改为由nio的FileChannel实现,因此在处理大文件的时候经常使用RandomAccessFile和MappedByteBuffer来读取,不仅读取速度更快,而且能够避免文件过大导致内存溢出。详解和示例
其他参考博文(侵删)
- https://www.ibm.com/developerworks/cn/java/j-lo-javaio/
- http://www.cnblogs.com/kuangdaoyizhimei/p/4034232.html
- http://www.cnblogs.com/kuangdaoyizhimei/p/4035611.html
nio和aio相关

上图是整理的nio与aio的一些关键点,瞟一眼就好,详细的nio讲解可参考: Java NIO使用及原理分析
图学java基础篇之IO的更多相关文章
- 图学java基础篇之并发
概述 并发处理本身就是编程开发重点之一,同时内容也很繁杂,从底层指令处理到上层应用开发都要涉及,也是最容易出问题的地方.这块知识也是评价一个开发人员水平的重要指标,本人自认为现在也只是学其皮毛,因此本 ...
- 图学java基础篇之集合工具
两个工具类 java.utils下又两个集合相关_(准确来说其中一个是数组的)_的工具类:Arrays和Collections,其中提供了很多针对集合的操作,其中涵盖了一下几个方面: 拷贝.填充.反转 ...
- 图学java基础篇之集合
(本文部分图片引用自其他博客,最后有链接,侵删.由于笔记使用markdown记录,格式可能不是太好看,见谅) 集合结构 红字为java.util包下的,绿字为concurrent包下扩展的与并发相关的 ...
- Java 基础篇之IO
IO Java IO 流使用了一种装饰器设计模式,它将 IO 流分成底层节点流和上层处理流,其中节点流用于和物理节点直接关联,程序可以把不同物理节点流包装成统一的处理流,从而允许程序使用统一的输入.输 ...
- Java基础篇(JVM)——类加载机制
这是Java基础篇(JVM)的第二篇文章,紧接着上一篇字节码详解,这篇我们来详解Java的类加载机制,也就是如何把字节码代表的类信息加载进入内存中. 我们知道,不管是根据类新建对象,还是直接使用类变量 ...
- java基础篇---I/O技术
java基础篇---I/O技术 对于任何程序设计语言而言,输入输出(I/O)系统都是比较复杂的而且还是比较核心的.在java.io.包中提供了相关的API. java中流的概念划分 流的方向: 输 ...
- 金三银四跳槽季,BAT美团滴滴java面试大纲(带答案版)之一:Java基础篇
Java基础篇: 题记:本系列文章,会尽量模拟面试现场对话情景, 用口语而非书面语 ,采用问答形式来展现.另外每一个问题都附上“延伸”,这部分内容是帮助小伙伴们更深的理解一些底层细节的补充,在面试中可 ...
- java基础篇---HTTP协议
java基础篇---HTTP协议 HTTP协议一直是自己的薄弱点,也没抽太多时间去看这方面的内容,今天兴致来了就在网上搜了下关于http协议,发现有园友写了一篇非常好的博文,博文地址:(http: ...
- java基础篇---I/O技术(三)
接上一篇java基础篇---I/O技术(二) Java对象的序列化和反序列化 什么叫对象的序列化和反序列化 要想完成对象的输入或输出,还必须依靠对象输出流(ObjectOutputStream)和对象 ...
随机推荐
- Json Web Token 简介
1.Json Web Token是干什么 简称JWT,在HTTP通信过程中,进行身份认证. 我们知道HTTP通信是无状态的,因此客户端的请求到了服务端处理完之后是无法返回给原 ...
- 使用kvm制作Eucalyptus镜像(Windows Server 2008r2为例)
1.前言 Elastic Utility Computing Architecture for Linking Your Programs To Useful Systems (Eucalyptus) ...
- C#运算符、控制流
1 运算符 1.1 一元运算符: -(负号).+(正号):可以省略 1.2 二元运算符: 优先级,*(乘)./(除).%(取余).+(加).-(减).=(赋值) 二元赋值运算符,=.+=.-= ...
- 【MFC】将当前的日期转化为1970年开始的秒计数
CTime time1 = CTime::GetCurrentTime(); int nTSeconds = time1.GetTime(); CTime time2(,,,,,); nTSecond ...
- hadoop上传文件失败报错(put: Cannot create file/eclipse.desktop._COPYING_. Name node is in safe mode.)
解决办法: 离开安全模式方法:执行以下命令即可 bin/hadoop dfsadmin -safemode leave 若不处理安全模式的话,web服务无法启动,dfsadmin report结果异 ...
- 利用expect实现自动化操作
管理机上需要安装expect包 yum -y install expect 1.定义主机ip [root@localhost ~]# cat ip.txt 192.168.1.12 192.168.1 ...
- ShopNC B2B2C多用户商城网站系统源码
直接正常安装就行哦 注意有服务器的安装可以更下安装时间的长度 也就是说进行跳转的 如果时间太少 这样会安装不成 数据导入不完成 所以就会安装不成功安装好后打开data\config\config.in ...
- 修改CAS实现控制某个用户在定义的时间内登录次数
思想: 在数据库增加字段 1.登录次数 2.登录失败时间(类型TimeStamp) 当一个用户进来认证的时候当登录失败的时候更新登录次数 和最后登录失败的时间. 主要是在登录成功或者失败的时候判断时 ...
- iOS解析新浪微博的@##以及URL链接并展示
最近在做一个跟微博相关的应用.其中涉及到了对微博中@.##以及URL链接的解析与展示.分享一下个人处理的方式,希望对需要的人有所帮助. 最终的展现效果: 首先,第一步是你得从纯文本中找到它们.毫无疑问 ...
- POJ 3734 Blocks (线性递推)
定义ai表示红色和绿色方块中方块数为偶数的颜色有i个,i = 0,1,2. aij表示刷到第j个方块时的方案数,这是一个线性递推关系. 可以构造递推矩阵A,用矩阵快速幂求解. /*********** ...