java.io 学习第一步:认识IO
1.首先,IO是干什么的?
标准点官方点是:通过数据流、序列化和文件系统提供系统输入和输出。
白话点:就是从计算机读东西和向计算机写东西!
2.IO也常称为IO流,那什么是流呢?
Java把这些不同来源和目标的数据都统一抽象为数据流。
流是一个很形象的概念,当程序需要读取数据的时候,就会开启一个通向数据源的流,这个数据源可以是文件,内存,或是网络连接。类似的,当程序需要写入数据的时候,就会开启一个通向目的地的流。这时候你就可以想象数据好像在这其中“流”动一样。
3.Java IO 类库
有以下用途的类库:
a) 标准输入输出
b) 文件的操作
c) 网络上的数据流
d) 字符串的流
e) 对象流
f) zip文件流
4.Java流的分类:
按流向分:
输入流: 程序可以从中读取数据的流。
输出流: 程序能向其中写入数据的流。
按数据传输单位分:
字节流: 以字节为单位传输数据的流
字符流: 以字符为单位传输数据的流
按功能分:
节点流: 用于直接操作目标设备的流
过滤流: 是对一个已存在的流的链接和封装,通过对数据进行处理为程序提供功能强大、灵活的读写功能。
5.Java IO 常见类
* 四大基石类:InputStream,OutputStream,Reader,Writer
这四个类均为抽象类。
JDK所提供的所有流类位于java.io包中,都分别继承自以上四种抽象流类。
InputStream:继承自InputStream的流都是用于向程序中输入数据的,且数据单位都是字节(8位)。
OutputStream:继承自OutputStream的流都是程序用于向外输出数据的,且数据单位都是字节(8位)。
Reader:继承自Reader的流都是用于向程序中输入数据的,且数据单位都是字符(16位)。
Writer:继承自Writer的流都是程序用于向外输出数据的,且数据单位都是字符(16位)。
*常见类如下图:
此图来自网络(感谢制图人)
重点类:
A.以上四个抽象类的子类:
字节流:FileInputStream,FileOutputStream,PipedOutputStream,PipedInputStream,
ByteArrayInputStream,ByteArrayOutputStream,DataInputStream,DataOutputStream,
SequenceInputStream,PushBackInputStream,ObjectInputStream,ObjectOutputStream,
ZipOutputStream,ZipInputStream,PrintStream等
字符流:FileWriter,FileReader,InputStreamReader,InputStreamReader等
B.其他辅助类或接口(指在使用流经常使用到):File,Serializable,Externalizable
C .一个关键字:transient (部分序列化时可以采用此关键字)
6.Java.IO在设计时所使用的设计模式
JDK的I/O包中就主要使用到了两种设计模式:Adatper模式和Decorator模式
* Decorator模式(装饰模式)
通过使用Decorator模式,可以在运行时扩充一个类的功能。其原理是:增加一个装饰类包裹原来的类,包裹的方式一般是通过在将原来的对象作为修饰类的构造器的 参数。装饰类实现新的功能,但是,在不需要用到新功能的地方,它可以直接调用原来的类中的方法。装饰类必须和被装饰的类有相同的接口。
类图如下:(图来自网上,感谢制图者)
* Adatper模式(适配器模式)
通过使用Adatper模式,可以使得通常因为接口不兼容而不能在一起工作的类工作在一起,做法是将类自己的接口包裹在一个已存在的类中。
类图如下:(图来自网上,感谢制图者)
7.参考博客网址如下:
java.io百度百科(一些IO的基本概念):
http://baike.baidu.com/view/1007958.htm#71-hi-1-99111-55efc26b7dc8814dd413e54791f596e8
java.io常用类之间一些关系:
http://www.cnblogs.com/oubo/archive/2012/01/06/2394638.html
java.io的一下常用类的一些常用方法(很适合初学者,可以按博客中的代码做一遍):
http://www.cnblogs.com/rollenholt/archive/2011/09/11/2173787.html
8.个人思考:
java.io,按其基本意思为,即输入输出!
掌握io,要分清何为输入,何为输出。首先是以程序为中心,程序是要从程序外部读数据,则使用输入流(类名常带Input),要向程序外部写数据则使用输出流(类名常带Output),这样就不易将输入输出搞混。
IO的输入输出类大部分对称,如FileInputStream,FileOutputStream等,其方法也很类似,读的方法常含read,写的方法常含write等。
IO打开后,要记住关闭!
学习IO应该了解IO设计时所采用的基本设计模式,在写代码时能清晰地明白为何采用这样的方法。
9.附录:
一些与IO相关的接口与类的用途如下:
接口摘要 | |
Closeable | Closeable 是可以关闭的数据源或目标。 |
DataInput | DataInput 接口用于从二进制流中读取字节,并根据所有 Java 基本类型数据进行重构。 |
DataOutput | DataOutput 接口用于将数据从任意 Java 基本类型转换为一系列字节,并将这些字节写入二进制流。 |
Externalizable | Externalizable 实例类的唯一特性是可以被写入序列化流中,该类负责保存和恢复实例内容。 |
FileFilter | 用于抽象路径名的过滤器。 |
FilenameFilter | 实现此接口的类实例可用于过滤器文件名。 |
Flushable | Flushable 是可刷新数据的目标地。 |
ObjectInput | ObjectInput 扩展 DataInput 接口以包含对象的读操作。 |
ObjectInputValidation | 允许验证图形中对象的回调接口。 |
ObjectOutput | ObjectOutput 扩展 DataOutput 接口以包含对象的写入操作。 |
ObjectStreamConstants | 写入 Object Serialization Stream 的常量。 |
Serializable | 类通过实现 java.io.Serializable 接口以启用其序列化功能。 |
类摘要 | |
BufferedInputStream | BufferedInputStream 为另一个输入流添加一些功能,即缓冲输入以及支持 mark 和 reset 方法的能力。 |
BufferedOutputStream | 该类实现缓冲的输出流。 |
BufferedReader | 从字符输入流中读取文本,缓冲各个字符,从而实现字符、数组和行的高效读取。 |
BufferedWriter | 将文本写入字符输出流,缓冲各个字符,从而提供单个字符、数组和字符串的高效写入。 |
ByteArrayInputStream | ByteArrayInputStream 包含一个内部缓冲区,该缓冲区包含从流中读取的字节。 |
ByteArrayOutputStream | 此类实现了一个输出流,其中的数据被写入一个 byte 数组。 |
CharArrayReader | 此类实现一个可用作字符输入流的字符缓冲区。 |
CharArrayWriter | 此类实现一个可用作 Writer 的字符缓冲区。 |
Console | 此类包含多个方法,可访问与当前 Java 虚拟机关联的基于字符的控制台设备(如果有)。 |
DataInputStream | 数据输入流允许应用程序以与机器无关方式从底层输入流中读取基本 Java 数据类型。 |
DataOutputStream | 数据输出流允许应用程序以适当方式将基本 Java 数据类型写入输出流中。 |
File | 文件和目录路径名的抽象表示形式。 |
FileDescriptor | 文件描述符类的实例用作与基础机器有关的某种结构的不透明句柄,该结构表示开放文件、开放套接字或者字节的另一个源或接收者。 |
FileInputStream | FileInputStream 从文件系统中的某个文件中获得输入字节。 |
FileOutputStream | 文件输出流是用于将数据写入 File 或 FileDescriptor 的输出流。 |
FilePermission | 此类表示对文件和目录的访问。 |
FileReader | 用来读取字符文件的便捷类。 |
FileWriter | 用来写入字符文件的便捷类。 |
FilterInputStream | FilterInputStream 包含其他一些输入流,它将这些流用作其基本数据源,它可以直接传输数据或提供一些额外的功能。 |
FilterOutputStream | 此类是过滤输出流的所有类的超类。 |
FilterReader | 用于读取已过滤的字符流的抽象类。 |
FilterWriter | 用于写入已过滤的字符流的抽象类。 |
InputStream | 此抽象类是表示字节输入流的所有类的超类。 |
InputStreamReader | InputStreamReader 是字节流通向字符流的桥梁:它使用指定的 charset 读取字节并将其解码为字符。 |
LineNumberInputStream | 已过时。此类错误假定字节能充分表示字符。 |
完成于2013-12-01 23:20:55