[size=large]发信人: hzxdark (漆黑之翼), 信区: Java
标 题: java.io包详细解说,希望对师弟师妹们有所帮助^_^
发信站: 荔园晨风BBS站 (Thu Dec 21 23:13:30 2006), 站内

我不知道各位是师弟师妹们学java时是怎样的,就我的刚学java时的感觉,java.io包是最让我感到一头雾水的。所以现在这篇文,尽可能简单地描述java.io包的结构,希望对java.io同样一头雾水的师弟师妹们有些帮助^_^

我开始学java时,java.io的介绍是在《java编程思想》里看的。说实话,当时完全看不明白——“java.io的是用‘decorator模式’来构建的”——刚学java时,天知道啥玩意叫decorator……

不过要明白java.io,确实需要理解decorator设计模式,下面详细介绍下。
所谓decorator,装饰,其实可以说是一种设计的技巧,说白了没什么难的,别看很多网上资料说的天花乱坠的(非常讨厌有些文章总是把简单的问题描述得跟两头猪的kiss问题一样复杂……)。

decorator的结构如下:

MyInterface
|
_______|_______
| |
Myclass Decorator
____|_____
| |
DecoratorA DecoratorB

decorator的目的是在不改变任何原有的类的基础下,添加新的功能(你可以理解为书上说的灵活性)。其中Myclass是你要扩展的类,DecoratorA跟DecoratorB封装了你要扩展的功能,并保存有一个MyInterface的引用。

考虑以下代码:
public static void main(Strings[] arg){
myInterface a = new myClass();
a.print();
}
myInterface 是myClass的接口,只声明了一个方法print(),myClass实现了该方法:

public void print(){
System.out.println("hello");
}

那么假如我们要在不改变原来的myClass的基础上,变成输出“hello world!”,要怎么做呢?
当然我们可以考虑直接写个myClass的子类,helloClass之类,但是要是要求根据环境不同,输出"hello world!",my hello world","my Hello"之类的组合呢?
用继承的方式将不得不写一堆类似的子类来。

decorator,装饰模式的解决方法是,只实现基本的功能,把附加的功能抽出来放一边。
例如以下代码:
class DecoratorA implements Decorator{
MyInterface myObject;
DecoratorA(myInterface myObject){
this.myObject = myObject;
}
public void print(){
myObject.print();
System.out.print("world!");
}
}

class DecoratorB implements Decorator{
MyInterface myObject;
DecoratorA(myInterface myObject){
this.myObject = myObject;
}
public void print(){
System.out.print("my");
myObject.print();
}
}

DecoratorA和DecoratorB的功能分别是打印出world跟my。这时main函数要打印出my hello world可简单变为:

public static void main(Strings[] arg){
MyInterface a =new DecoratorA(new DecoratorB(new MyClass());
a.print();
}

简单吧?简单的说,就是:
print(){
print("xxx");//可替换成你要添加的任何处理;
myObject.print();//调用基础类的函数;
xxxx; //后续处理
}
Decorator的介绍就到此为止,接下来讲java.io.

看到

MyInterface a =new DecoratorA(new DecoratorB(new MyClass());

是不是觉得眼熟咧?这跟

BufferedInputStream bis = new BufferedInputStream(new DataInpuStream(new FileInputStream("xxx.txt")));

是不是很像?

(画外音加一个臭鸡蛋扔上来:因为java.io就是用decorator模式组织的,当然像啦……)

java.io分Stream跟reader、writer两大类,这里只详细介绍Stream,并最后两者间的关系。Stream又分inputStream、OutputStream,两者基本是对称的,这里也只介绍InputStream.

java.io.InputStream
|
_______________________|________________________
| |
ByteArrayInputStream FilterInputStream
StringBufferInputStream _____________________|____________________________
FileInputStream | | | |
PipedInputStream DataInputStream BufferedInputStream LineNumInpuStream XXX

(注:xxx是PushbackInputStream,上面的图放不下)

这个图跟最初介绍的hello world的图很像吧?呵呵。
基础的流只有左边4个,这些流代表了数据的来源,所有的流都必须从这四个中之一开始。(注,还有一个RandomAccessFile、File,这两个不在本文介绍范围)。
然后当我们需要什么添加功能,就从右边中选择一个装饰。例如,我们需要缓存功能,那么需要bufferedInputStream装饰:

BufferdInputStream is = new BufferedInputStream(new FileInputStream("xxx.txt"));

假如再要DataInputStream的功能,只要在加一层:
DataInputStream dis = new DataInputStream(new BufferdInputStream(new FileInputStream));
(厄,我不甚明白这个类添加的功能是做什么用的,资料说是增加读取java原生数据的功能,不甚明白,有清楚的来补充一下,pipeInputStream跟sequenceInputStream也没用过,欢迎补充说明)
这里你可以想象成,在基本的FileInputStream.readxxx()方法在BufferedInputStream的readxxx()方法调用,并添加相应的处理。

最后说说InputStream跟reader的区别:

老实说,我只知道一个支持字节流,一个支持unicode流,除此之外有啥米性能上的不同我还真不知道,哈哈。知道的快来补充补充~[/size]

最好的java io包解密相关推荐

  1. java.io包对象读写_java.io 包中的____________和____________类主要用于对对象(Object)的读写_学小易找答案...

    [多选题]连铸钢水成分控制的要求有( ). [单选题]起动机用直流电动机将电能转化为 [单选题]下列关于我国少数民族传统禁忌的说法中,错误的是( ). [多选题]下列选项中 , 属于表单控件的是 ( ...

  2. Java.io包中常用的类

    Java.io包 Java.io.BufferedInputStream类实例 Java.io.BufferedOutputStream类使用例子 Java.io.BufferedReader类 Ja ...

  3. Java源码解析——Java IO包

    一.基础知识: 1. Java IO一般包含两个部分:1)java.io包中阻塞型IO:2)java.nio包中的非阻塞型IO,通常称为New IO.这里只考虑到java.io包中堵塞型IO: 2. ...

  4. 【JDK源码】java.io包常用类详解

    看完java.io的JDK源码,在网上发现一篇关于java.io中的类使用的文章总结的很全面,看完之后在原文的基础上加了一些自己的总结如下构成了本篇文章.原文地址 一.Java Io流 1. Java ...

  5. 装饰器模式与java.io包

    为什么80%的码农都做不了架构师?>>>    Decorator设计模式是典型的结构型模式(在GOF的那本模式的Bible中将模式分为:1.创建型模式:2.结构型模式:3.行为模式 ...

  6. java.io包和杯子测楼

    1 java.io 字符流:Reader 字节流:InputStream 2 杯子测楼 一种杯子,若在第N层被摔破,则在任何比N高的楼层均会破,若在第M层不破,则在任何比M低的楼层均不会破,给你两个这 ...

  7. import java.io 包下载_Go 包管理机制深入分析

    前言 随着 Go 语言的深入使用,其依赖管理机制也一直是各位 Gopher 热衷于探讨的话题.Go 语言的源码依赖可通过 go get 命令来获取,但自动化程度不高,于是官方提供了 Dep 这样的自动 ...

  8. java.io包有哪些方法_java.io包下常用类及常用方法介绍

    测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试 ...

  9. Idea 导包自动变成星号 Idea 导包自动变成*号的问题 java.io.* Idea 自动导包变成星号

    Idea 导包自动变成星号 Idea 导包自动变成*号的问题 java.io.* Idea 自动导包变成星号 一.问题描述 1.在使用idea开发时,经常会出现导入的包自动变成 xx.*的情况,比如下 ...

  10. Java - IO部分的学习总结

    文章目录 1.File类 File类的构造方法 File类的常用方法: 1.1对一些构造方法和方法的使用 1.1.1创建文件和创建文件夹: 1.1.2在文件夹里面创建一个文件: 1.1.3对文件进行删 ...

最新文章

  1. python 大数据学习 遇到的问题,及解决方法。
  2. 元宇宙iwemeta:2021年企业领袖榜公布,曹德旺为终身成就奖
  3. 远程接入-天翼5系统让ERP穿越时空!
  4. 利用border制作三角形原理
  5. XState Viz 可视化和调试状态机
  6. Oracle 写存储过程的一个模板还有一些基本的知识点
  7. 快速搭建本地服务器 php,本地PHP服务器环境快速搭建
  8. [网络流24题] 软件补丁问题
  9. github微信小程序服务器,GitHub - cp871202/nideshop: NideShop 开源微信小程序商城服务端(Node.js + ThinkJS)...
  10. MyBatis从入门到精通(五)—MyBatis插件原理探究和自定义插件实现
  11. 15.元组(低调的元组,不一样的精彩)
  12. 手机红外遥控器 求源码
  13. 如何来投放广告更赚钱
  14. java的springboot项目操作阿里云OSS下载文件、查看文件内容、上传文件,自定义工具类
  15. 数据库中的除运算一点就通
  16. 利用UltraLibrarian生成Altium designer原理图、PCB封装
  17. 【JAVA程序设计】基于SpringBoot+VUE的高校疫情打卡系统-前后端分离
  18. 踩坑日记之Springfox+Kotlin lateinit引发NullPointException
  19. 如果你的男朋友是学计算机的,有一个学计算机的男朋友是种怎样的体验?
  20. 命运歌姬服务器停服维护中,命运歌姬2月27日更新什么? 2月27日双端维护内容公告...

热门文章

  1. 前端实现文字头像、随机背景色、圆角-附赠示例代码
  2. 编写一个简单的python程序_如何编写一个简单的程序
  3. 重磅!上海乐高乐园度假区正式开工;创维推出守护者电视将全系搭配“智慧眼” | 美通社头条...
  4. 图形渲染-体积云【理论基础与实现方案】
  5. so文件跳转指令生成
  6. EMNLP2019获奖论文出炉,最佳论文一作华人,导师为NLP公认大神Jason Eisner
  7. 【好工具】轻量无广告可预览的解压软件
  8. 使用pychram安装Python第三方库报错的解决方法
  9. 风口之下,猪都能飞。当今中国股市牛市,真可谓“错过等七年”。 给你一个回顾历史的机会,已知一支股票连续n天的价格走势,以长度为n的整数数组表示,...
  10. 【EndNote9】引文导入后有%J问题(或其它类似问题)解决方法