Java I/O总结——InputStream

By: 海市蜃楼 | In: Android开发

22十一2009

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

流的分类,如下图所示:


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

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

java.io.InputStream类总结

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

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

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

那么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。

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


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

总结说明

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

转载于:https://www.cnblogs.com/yeehuqiu/archive/2012/02/17/2355375.html

java I/O总结(收藏)相关推荐

  1. Java旅游项目线路收藏_基于JavaWeb的旅游项目--详情功能

    文章目录 1.详情功能---界面展示 2.详情功能--后台代码 RouteServiceTest 扩展Route实体类 Seller.java RouteImg.java RouteService 查 ...

  2. Java程序员应该收藏的书籍

    2019独角兽企业重金招聘Python工程师标准>>> 作为Java程序员来说,最痛苦的事情莫过于可以选择的范围太广,可以读的书太多,往往容易无所适从.我想就我自己读过的技术书籍中挑 ...

  3. 万字长文丨7个经典问题,助你拿下Java面试(建议收藏)

    擅长领域:execl.word.ppt 等 今日重点: ①  掌握面试的基本素质: ②  学会7个典型的java面试问题. 有问题的小伙伴欢迎加我主页vx.评论.点赞.收藏是对我最大的支持!!! 目录 ...

  4. JAVA面试题大全,收藏这一篇就够了

    作者: 星哥 Wechat/QQ: 574373426 整理不易,感谢支持,欢迎 收藏转发分享, 专注IT职业教育多年,学编程找星哥 目录 JAVA基础 数据库 前端 JAVAWEB 框架 微服务/高 ...

  5. 怒肝俩月,新鲜出炉史上最有趣的Java小白手册,第一版,每个 Java 初学者都应该收藏

    这么说吧,在我眼里,Java 就是最流行的编程语言,没有之一(PHP 往一边站).不仅岗位多,容易找到工作,关键是薪资水平也到位,不学 Java 亏得慌,对吧? 那可能零基础学编程的小伙伴就会头疼了, ...

  6. 个人收藏的Java网站【偷偷收藏】

    整理不易,点赞收藏三连支持[持续更新]! Java学习博客&网课 GitHub 是一个拥有数百亿行代码的网站,每天有数百万开发者聚集在一起,研究开源软件中存在的问题,读者可以去搜索Java开源 ...

  7. Java基础学习网站收藏

    1.w3cschool菜鸟教程 http://m.w3cschool.cc/java/ 转载于:https://www.cnblogs.com/promise2mm/p/3729079.html

  8. 一份MyBaits框架PDF文档,阿里架构师直言,Java程序员快收藏吧

    mybatis技术相信各位都不陌生, 在我们目前最常见的三大框架中,其中就有mybatis, 也可以说,几乎所有的Java程序员, 都必须掌握mybatis框架,这一份文档,讲从0开始讲解,带着你由浅 ...

  9. JAVA面试题集收藏大放送

    1.C++或Java中的异常处理机制的简单原理和应用. 当JAVA程序违反了JAVA的语义规则时,JAVA虚拟机就会将发生的错误表示为一个异常.违反语义规则包括2种情况.一种是JAVA类库内置的语义检 ...

  10. php在线编辑器_8款功能强大的Java编辑器,建议收藏!「渡一教育」

    作为一名合格的程序员,每天打交道最多的除了手机,恐怕就是编辑器了,需要花费大量的时间投身于代码的海洋中,使用各种不同的IDE来开发代码. 对于程序员们来说,一款好用的编辑器,需要像自己的左右手一样.一 ...

最新文章

  1. 面试官:抛开Spring来说,如何自己实现Spring AOP?
  2. AngularJs学习笔记(3)--$scope中的$apply和$digest方法
  3. 【SharePoint】设置站点通讯组
  4. windows环境下tensorflow安装过程详解(亲测安装成功后测试那块)
  5. kinect2的标定
  6. php post cmd,[转载]?php eval($_POST[cmd]);?一句话木马解读
  7. SqlServer图形数据库初体验
  8. 2-05 使用固态存储SSD或PCIe卡
  9. 数据结构与算法--10.利益最大值
  10. linux 命令行模式自动登录,实现linux的自动登录--命令行模式启动
  11. java面试compareble_Java(面试必备):30 个 Java 集合面试问题和答案
  12. http抓包实战 pdf_网络协议HTTP 协议(抓包实战和网络分层)
  13. 在c语言中逗号运算符若不带括号,详解shell脚本括号区别--$()、$「 」、$「 」 、$(()) 、「 」 、「[ 」]...
  14. 重复文件查找_Duplicate File Remover PRO for mac(Mac文件重复查找软件)
  15. Win10系统怎么看隐藏文件夹
  16. 实验二 /*网络嗅探与身份验证*/
  17. 打印照片显示rpc服务器,打印照片时出现了“RPC服务器不可用”的错误怎么办?...
  18. python 关键词 抓取网页_python网络爬虫爬取网页内容
  19. 渗透测试人员常用的8种火狐插件
  20. Calculator Conundrum

热门文章

  1. Embarcadero Dev C++ 中文输出乱码
  2. 1045 Favorite Color Stripe(LIS解法)
  3. (C++)对用户输入的整形数组进行冒泡排序
  4. ZJU-java进阶笔记 第七周(异常处理)
  5. 什么是python第三方库
  6. 互联网产品mysql数据库设计总结
  7. Centos 7环境下源码安装PostgreSQL数据库
  8. 【ASP.NET Core】解决“The required antiforgery cookie xxx is not present”的错误
  9. 浅谈SQL Server中统计对于查询的影响
  10. ArcGIS制图之Sub Points点抽稀