`

java io的认识

阅读更多

 

在前面介绍了Decorator(装饰)模式, 让我自己想起了刚开始工作时那段“痛并快乐”的学习时光。在学习Android网络方面,也发现网络方面的很多内容都与Java I/O有关,因此暂时先停下Android网络方面的学习,把Java I/O完整的学习下。我们将按照基类的顺序:InputStream、OutPutStreamReaderWriter来分别对Java I/O加以总结。

在这里强调以下2点:

  • 如果你对设计模式中的Decorator(装饰)不是很了解,请仔细阅读:从new BufferedReader(new InputStreamReader(conn.getInputStream()))想到的,在这篇博客中,我们详细介绍了Decortor(装饰)模式。在了解了Decorator(装饰)后,我们对学习Java I/O的学习会容易很多,因为Java I/O的核心就是采用了Decorator(装饰)模式。
  • Java I/O系列的博客是我在学习Java I/O的基础上,对Java I/O的总结,关于Java I/O方面的基础知识,我们在这里不详细说明。如果你对Java I/O完全不了解,请先找些关于Java I/O方面的资料简要阅读下。在简要学习的基础上,我们将Java I/O方面的资料整理,帮助大家对Java I/O的知识更加清晰些。

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开发详解.zip

    031208_【第12章:JAVA IO】_System类对IO的支持笔记.pdf 031209_【第12章:JAVA IO】_BufferedReader笔记.pdf 031210_〖第12章:JAVA IO〗_IO操作实例笔记.pdf 031211_【第12章:JAVA IO】_Scanner笔记.pdf 031212_...

    说说IO:IO原理与解析.zip

    内容概要:IO的分层;IO模型;IO性能的重要指标;文件系统;...使用场景:想学习JavaIO以及在IO开发中遇到瓶颈 目标:通过本教程的讨论与解析,更加深刻的理解和认识IO,熟练的操作IO,避免踩坑,陷入误区。

    JAVA基础知识课件 适合初学者

    JAVA基础知识课件 适合初学者 包括 ch1 Java概述 ch2 Java基本语法 ch3 类与对象 ch4-1 继承、接口和多态 ch4-2 继承、接口和多态 ch5 常用Java类库 ...看完受益匪浅,对JAVA有新认识,大学生期末考试可90+

    JAVA基础教程

    --第 1 章 认识 Java --第 2 章 简单的 Java 程序 --第 3 章 Java 基本程序设计 --第四章、数组与方法 第 2 部分 Java面向对象程序设计 •面向对象概念 •类与对象 •类的封装性、继承性、多态性 •Java 异常...

    Java编程复习代码

    大四学期复习Java基础所产生的代码笔记,着重回顾了字符串、IO、线程以及socket套接字编程,在每一分代码中都附带了自己编程时的一些认识、笔记。适合Java基础不够踏实的童鞋。

    java_I/ODemo

    对程序语言的设计者来说,创建一个好的输入/输出(I/O)系统是一项艰难的任务,在整个Java.io包中最重要的就是5个类和一个接口。...掌握了这些IO的核心操作那么对于Java中的IO体系也就有了一个初步的认识

    AIC的Java课程1-6章

     课程目标  认识Java平台,了解java application和applet的开发,激发学员对Java编程语言的兴趣。  学习和掌握Java变量,运算符,控制结构,数组,方法等基本语法。  培养和建立面向对象编程...

    java基础案例与开发详解案例源码全

    13.2 JavaIO原理332 13.3 流类结构333 13.3.1 InputStream和OutputStream333 13.3.2 Reader和Writer334 13.4 文件流336 13.4.1 FileInputStream和FileOutputStream336 13.4.2 FileReader和FileWriter338 13.5 缓冲流...

    java基础核心总结归纳---参考手册--心得手册-学习资料-总结经验

    基础 IO 类和相关⽅法 25 InputStream 25 OutputStream 25 Reader 类 26 Writer 类 26 InputStream 及其⼦类 27 OutputStream 及其⼦类 27 Reader 及其⼦类 28 Writer 及其⼦类 28 注解 28 关于 null 的⼏种处理⽅式...

    Java思维导图xmind文件+导出图片

    初步认识RabbitMQ及高可用集群部署 详解RabbitMQ消息分发机制及主题消息分发 RabbitMQ消息路由机制分析 RabbitMQ消息确认机制 Redis redis数据结构分析 Redis主从复制原理及无磁盘复制分析 Redis管道模式...

    JAVA中级书籍

    1、对于Java基础技术体系(包括JVM、类装载机制、多线程并发、IO、网络)有一定的掌握和应用经验。 掌握JVM内存分配、JVM垃圾回收;类装载机制; 性能优化; 反射机制;多线程;IO/NIO; 网络编程;常用数据结构和...

    Java中String类和IO流——学习小结

    String类在java.lang包中,java使用String类创建一个字符串变量,字符串变量属于对象。String类对象创建后是一个常量,有final修饰,不能被修改。字符串重新赋值不是修改,而是生成了一个新的字符串,原先的字符串...

    java8源码-mechanicI.github.io:mechanicI.github.io

    本文档倾向于提供一个比较详细的学习路径,对于Java整体的知识体系有一个初步认识。另外,本文的一些文章 也是学习和复习 Java 知识不错的实践; 对于非 Java 初学者来说: 本文档更适合回顾知识,准备面试,搞清...

    formacao-java:Alura Java培训中的所有分步课程

    Java库 Java第5部分:软件包和java.lang 用Java捕捉文本的一部分 在Java中从字符串交换字符 Java第6部分:认识java.util Java中int和integer之间的区别 用Java舍入数字 Java第7部分:使用java.io Java SE中的设计...

    J2SE技术总结-Java学习精华教程-电子书

    .....Java语言认识 ..........概述 ..........Java语言认识 ..........Java底层平台认识 .....JDK安装与配置 ..........安装JDK ..........设置环境变量 ..........虚拟机的内存 .....JDK工具使用 ..........javac....

    Java经典入门教程pdf完整版

    CLDC的规格之中,只支持java.lang.*、java.io.*、以及java.uti1.*这些类。此版本 也增加了一些攴持“微小装置”的扩充类,如 Javax. microedition.io.*类。然而,此版 木并不支持所有的Java基木类,就标准的 JMECLDO,也...

    Node.js websocket使用socket.io库实现实时聊天室

    认识websocket WebSocket protocol 是HTML5一种新的协议。它实现了浏览器与服务器全双工通信(full-duple)。一开始的握手需要借助HTTP请求完成。 其实websocket 并不是很依赖Http协议,它也拥有自己的一套协议机制,...

    面向对象技术与UML课件及源代码-by 南邮-陈杨

    第11章Java IO操作 第12章多线程开发 第13章反射技术 第14章实验指导3 下篇UML 第15章UML入门 第16章用例图 第17章类图和对象图 第18章实验指导4 第19章顺序图、协作图、状态图和活动图 第20章包图、...

    vlcj源代码 java

    vlcj源码,结合http://caprica.github.io/vlcj/javadoc/2.4.0/index.html文档,对于vlcj的应该有个认识。

Global site tag (gtag.js) - Google Analytics