`

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类结构图,建议大家打印出来后, 在以后使用时候在拿出来看下,就知道如何使用了。当然这张类图结构还不完整(缺少其他一些类),打印出来后自己补充说明,把这张类图逐步完善。

分享到:
评论

相关推荐

    javaIO struts2的一些相关资源

    多线程是并发编程的关键,"030901_【第9章:多线程】_认识多线程笔记.pdf"和"030902_【第9章:多线程】_线程常用操作方法笔记.pdf"探讨了如何在Java中创建和管理线程,这对于理解Struts2中的异步处理和并发性能优化...

    java_IO学习代码

    Java IO(Input/Output)是Java编程语言中用于处理输入和输出操作的重要组成部分。它提供了丰富的类库,允许程序员在程序...记住,实践是检验知识的最好方式,尝试运行和修改这些代码,会让你对Java IO有更直观的认识。

    Java之IO流学习总结.pdf

    首先,我们来认识IO流中的基本类。在Java中,所有与IO相关的类都位于java.io包中。主要的抽象基类有InputStream、OutputStream、Reader和Writer。InputStream和OutputStream是处理字节数据的基类,而Reader和Writer...

    io流的认识练习

    在这个"io流的认识练习"中,我们将深入探讨这两个关键概念。 首先,`File`类提供了许多方法来操作文件和目录。例如,`exists()`用于检查文件或目录是否存在,`mkdirs()`用于创建多级目录,`renameTo()`用于重命名...

    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_...

    1java认识与首个应用程序发布

    学习Java的第一章通常会涵盖这些基础知识,为后续的面向对象编程、异常处理、集合框架、IO流、多线程、网络编程等进阶主题打下基础。Java还提供了丰富的库和框架,如Spring、Hibernate、MyBatis等,用于构建复杂的...

    简单JAVA例程(绝对新手实例)认识JAVA

    这个“简单JAVA例程(绝对新手实例)”的压缩包文件提供了入门级别的Java代码示例,帮助新手逐步认识和了解Java编程。 首先,让我们来探讨Java的基础知识: 1. **Java语法基础**:Java的语法结构与C++类似,但更加...

    java + swing + io + 多线程 +聊天室

    通过这个项目,学习者可以深入理解Java GUI编程、网络通信、多线程和IO流的实践应用,同时对数据结构、设计模式和异常处理有更深入的认识。在实践中不断调试和优化代码,将有助于提升编程技巧和问题解决能力。

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

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

    李兴华java开发实战经典讲义(PDF格式)

    4. **Java IO**:031203_【第12章:JAVA IO】_字节流与字符流笔记.pdf 和 031217_【第12章:JAVA IO】_对象序列化笔记.pdf,IO是Java中处理输入输出的重要模块,这里讲解了字节流和字符流的区别与使用,以及如何实现...

    IO文件读取

    在IT行业中,文件读取是基础且至关重要的操作,尤其在处理输入/输出(IO)时。本主题将深入探讨“IO文件读取”的概念、方法以及...通过以上介绍,你已经对Java中的文件读取有了全面的认识,可以灵活地应用于各种场景。

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

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

    【主会场】3.杨晓峰-重新认识现代Java(1215).pdf

    本文将从多方面深入浅出Java技术,重新认识现代Java的优势和特点。 首先,Java是一种跨平台的语言,可以在各种设备上运行。这使得Java成为了企业软件、IOT、移动设备等领域的首选语言。同时,Java也具有强大的并发...

    java2年工作经验简历_java简历.doc

    7. **JVM**:对Java虚拟机有基本的认识,了解类加载机制、内存模型(堆、栈、方法区等)、垃圾回收机制等,能够进行简单的JVM调优。 8. **Spring框架**:熟悉Spring框架的核心特性,如依赖注入(DI)、AOP(面向切...

    Java 2全方位学习

    除此之外,书中还会涵盖Java的IO/NIO(新IO)系统,讲解文件操作、输入/输出流、缓冲区、字符集以及网络编程的基础知识,这对于处理数据交换和服务器端编程至关重要。 对于Java的GUI(图形用户界面)编程,书中的...

    java经典入门教程

    1. **Java基础知识**:首先,教程会讲解Java的历史和应用领域,让学习者对Java有一个宏观的认识。接着,将介绍Java开发环境的搭建,包括JDK的安装、Java Development Kit(JDK)中的关键工具,如javac编译器和Java...

    java四大名著pdf

    阅读这些书籍,不仅可以提升你的Java技术水平,还能让你对整个Java生态系统有更全面的认识。 在学习过程中,结合实践项目和实际问题,将理论知识应用于解决实际问题,将使你的Java技能得到质的飞跃。记住,持续学习...

    中南大学Java实验报告四

    在本篇中,我们将深入探讨“中南大学Java实验报告四”的核心内容,这份报告旨在深化学生对Java编程语言的理解,通过...在完成这个实验的过程中,他们将对Java有更全面、更深入的认识,为今后的学习和工作打下坚实基础。

    MLDN JAVA讲座 课程PDF文档

    【第12章:JAVA IO】章节深入探讨了JAVA的输入输出系统,031203_【第12章:JAVA IO】_字节流与字符流笔记.pdf和031217_【第12章:JAVA IO】_对象序列化笔记.pdf,讲述了如何读写文件、处理字节流和字符流,以及对象...

Global site tag (gtag.js) - Google Analytics