Java I/O流总结

简介

近期学习Hadoop的过程中,发现对流的概念理解的不是很深入。决定把《Java核心技术》书中关于流与文件的部分重新梳理学习。结合JDK 7,利用SmartDraw工具将流中主要的类接口通过UML图,将I/O主要的流类和接口展示出来。

流的概念

在Java API中,可以从其中读入一个字节序列的对象称为输入流,而可以向其中写入一个字节序列的对象称作输出流。这些字节序列的来源地和目的地可以是文件,而且通常都是文件,但是也可以是网络连接,甚至是内存块。抽象类InputStream和OutputStream构成了有层次结构的输入/输出(I/O)类的基础。

因为面向字节的流不便于处理以Unicode形式存储信息,所以从抽象类Reader和Writer中继承出来的专门用于处理Unicode字符的类构成一个单独的层次结构。这些类拥有的读入和写出操作都是基于两字节的Unicode码元的,而不是基于字节的字符。

从对流的描述中,我们了解流其实针对的是文件内容的处理,这个和File类有区别的,File类关心的是在磁盘文件上的存储。

流家族UML图

把流家族中的成员按照它们的使用方法进行划分,这样就形成了处理字节和字符的两个单独的层次结构。InputStream和OutputStream类可以读写整个的字节和字节数组,构成了下图所示层次结构的基础:

对于Unicode文本,可以使用抽象类Reader和Writer的子类,基本方法与对应的InputStream和OutputStream中的类类似:

几个和流相关的接口:Closeable/AutoCloseable, Readable, Flushable和Appendable,基类InputStream,OutputStream, Reader和Writer与它们的实现关系如下图所示:

组合流过滤器

某些流(例如FileInputStream和由URL类的openStream方法返回的输入流)可以从文件或其他更外部的位置获取字节,而其他的流(如DataInputStream和PrintWriter)可以将字节组装到更有用的数据类型中。Java程序员必须对二者进行组合。例如:从文件中读取输入数字,首先需要创建一个FileInputStream,然后将其传递给DataInputStream的构造器:

FileInputStream fin = new FileInputStream("employee.dat");
DataInputStream din = DataInputStream(fin);
double s = din.readdouble();

参考资料

1. Java核心编程 卷2 第1章 流与文件

2. Java JDK7 API


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值