Java I/O总结——InputStream

转载 2012年03月29日 14:53:58

Java I/O相关的包,如下表格所示:

java-io

在这里,我们主要介绍java.io包。

流的分类,如下图所示:

流的分类
过滤流就是采用了Decorator(装饰)模式,后面我们会为大家详细说明。

Java I/O的设计原则(Decorator(装饰)模式)

Java I-O库的设计原则

java.io.InputStream类总结

首先学习基类java.io.InputStream(读取一系列字节的对象),以及在它基础上派生出来的子类,类结构图如下图所示(单击查看大图片):

InputStream

InputStream是一个抽象类,是所有数据形式为字节的输入流的父类,为基于字节的数据输入定义了基本操作方法。实际上,InputStream的子类大部分都没有增加任何其他的接口函数(在上面的类结构图中就可以发现),因此在看InputStream子类的时候,我们主要学习其构造函数。

Java I/O中是如何采用Decorator(装饰)模式的呢?下面为大家详细说明,看到FilterInputStream类(也就前面说的过滤流,后面你会发现更多的过滤流),你是否发现了?对,就是FilterInputStream类,她就相当于Decorator(装饰)模式中的Decorator类,而且的BufferedInputStream、DataInputStream、PushbackInputStream则相当于是ConcreateDecorator,如下图所示:

Component-UML

那么Java I/O中到底是如何使用的了?Decorator(装饰)模式的主要意图是:动态地给一个对象添加一些额外的职责,这句话很抽象,我们结合Java I/O举个具体的例子:比如说我们读取文件,首先打开文件获取到File,然后我们再创建一个FileInputStream,然后读取文件。读取文件是一个很费时的操作,尤其是需要多次的读写文件。

自己的一点经历与大家分享:在一次C++编程的时候,需要打开文件然后每次读取一小段数据,后来发现整个程序的效率比较低,通过测试代码发现,对数据的读取方面占用太多的时间。尽管C++对文件的读取中实现了缓冲机制,但是好像这个缓冲区域比较小,然后通过_setbuf()函数增大缓冲区,发现程序的数度居然提升了很多。

那么在Java中采用面向对象的思想:BufferedInputStream实现了对数据读取的缓冲机制,通过FileInputStream来读取数据,BufferedInputStream将已经读取的数据存储到缓冲区,BufferedInputStream相当于对FileInputStream进行了“装饰”。

File file = new File(“c:\\moandroid.txt”,true);
InputStream is = new BufferedInputStream(new FileInputStream(file));
long length = file.length();
if(length>Integer.MAX_VALUE)
{
System.out.println(“source file is too large”);
return ;
}
byte[] bytes = new byte[(int)length];
int offset = 0,numRead = 0;
while( offset<bytes.length && (numRead = is.read(bytes,offset,bytes.length-offset))>= 0)
offset += numRead;
if(offset<bytes.length)
throw new IOException(“Could not completely read file”+file.getName());
is.close();

DataInputStream类的功能则更加强大,其在InputStream类的基础上增加了很多读取函数的接口,举个例子如下:

InputStream is = null;
try
{
File file = new File(“c:\\moandroid.txt”,true);
is = new DataInputStream(new FileInputStream(file));
int intData = is.readInt();
boolean boolData = is.readBoolean();
}
catch(FileNotFoundException e)
{
e.printStackTree();
}
catch(IOException e)
{
e.printStackTree();
}
finally
{
if(is!=null)
{
try{is.close();}
catch(IOException e){}
}
}

这里补充说明:DataInputStream读取的顺序必须和实际数据存储的顺序一致,否则会出现IOException。

上面的代码可以使用如下图来表示,更加的直观:

Input Stream Chain
大家再去仔细看下Decorator(装饰)模式中的例子:一个具有边框与滚动条的文本显示窗口,是不是很相似!

总结说明

整个java.io的核心都是采用了Decorator(装饰)模式,理解了Decorator(装饰)模式,对Java I/O的学习是不是更加简单了,这里我只是将自己的学习的笔记整理后与大家分享。java.io.InputStream类结构图,建议大家打印出来后,在以后使用时候在拿出来看下,就知道如何使用了。当然这张类图结构还不完整(缺少其他一些类),打印出来后自己补充说明,把这张类图逐步完善。

相关文章推荐

Java I/O总结——InputStream

在前面介绍了Decorator(装饰)模式,让我自己想起了刚开始工作时那段“痛并快乐”的学习时光。在学习Android网络方面,也发现网络方面的很多内容都与Java I/O有关,因此暂时先停下Andr...

java I/O流(一)——FileWriter,BufferedWriter,inputStream,BufferedInputStream,InputStreamReader

I/O全名:Input Output,输入输出的意思•IO流用来处理设备之间的数据传输 •流操作分两种:字节流,字符流 •流按流向分为:输入流,输出流•字节流的抽象积累◦InputStream ...

Java I/O流-总结(InputStream,OutputStream,Reader,Writer)

一、  流的分类   •   按数据流动方向   – 输入流:只能从中读取字节数据,而不能向其写出数据   – 输出流:只能向其写入字节数据,而不能从中读取数据   •   按照流所处...

Java I/O流-总结(InputStream,OutputStream,Reader,Writer)

Java流总结 一、  流的分类 •   按数据流动方向 – 输入流:只能从中读取字节数据,而不能向其写出数据 – 输出流:只能向其写入字节数据,而不能从中读取数据 •   按照流所处理的数...
  • oypj2010
  • oypj2010
  • 2012年06月13日 16:48
  • 10193

Java I/O流-总结(InputStream,OutputStream,Reader,Writer)

本文出处:点击打开链接 一、  流的分类   •   按数据流动方向   – 输入流:只能从中读取字节数据,而不能向其写出数据   – 输出流:只能向其写入字节数据,而不能从中读取数据   •   按...

Java I/O总结 -- InputStream

转载网址:http://www.moandroid.com/?p=1435 在前面介绍了Decorator(装饰)模式,让我自己想起了刚开始工作时那段“痛并快乐”的学习时光。在学习Android网络...

JAVA I/O中面向字节的InputStream和OutputStream以及面向字符的Reader和Writer简介

Java的IO操作中有面向字节(Byte)和面向字符(Character)两种方式. 面向字节的操作为以8位为单位对二进制的数据进行操作,对数据不进行转换,这些类都是InputStream和Outpu...
  • kkdelta
  • kkdelta
  • 2012年07月24日 18:26
  • 8892

Java之I/O(1-InputStream类及其子类)

Java的I/O总是会被经常用到,每次用的时候总感觉有点不知所措,因为package java.io里有太多的类可以使用了,所以,抽出一些时间弄清楚Java I/O的发展史很有必要。只要弄清楚了这些类...

Java I/O系统之InputStream

1.InputStream类型 继承自InputStream的流都是用于向程序中输入数据,且数据的单位为字节(8bit);下图中深色为节点流,浅色为处理流。 2.InputStream...

Java随笔(2)I/O流中InputStream/OutputStream

如有转载,请注意: http://blog.csdn.net/wjzj000/article/details/53911635 本菜开源的一个自己写的Demo,希望能给Androider们...
  • wjzj000
  • wjzj000
  • 2016年12月28日 18:19
  • 269
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Java I/O总结——InputStream
举报原因:
原因补充:

(最多只允许输入30个字)