目录
一、流的概念与作用
二、Java IO的用途和特征
三、流的使用详解
一、流的概念与作用
流(Stream): 在Java IO中,流是一个核心的概念。流从概念上来说是一个连续的数据传输过程。人们根据数据传输特性将流抽象为各种类,方便更直观的进行数据操作。你既可以从流中读取数据,也可以往流中写数据。流的特性与数据源或者数据流向的媒介相关联。
作用:为数据源和目的地建立一个输送通道。
在Java IO中按照数据单位将流分为两类:
1.字节流:以字节为单位进行读写 1字节(byte) = 8位(bit)。
2.字符流:以字符为单位进行读写 1字符 = 2字节
字节流和字符流的区别:
- 字节流没有缓冲区,是直接输出的,而字符流是输出到缓冲区的。因此在输出时,字节流不调用colse() 方法时,信息已经输出了,而字符流只有在调用close() 方法关闭缓冲区时,信息才输出。要想字符流在未关闭时输出信息,则需要手动调用flush() 方法。
- 读写单位不同:字节流以字节(8bit)为单位,字符流以字符为单位,根据码表映射字符,一次可能读多个字节。
- 处理对象不同:字节流能处理所有类型的数据(如图片、avi等),而字符流只能处理字符类型的数据。
I/O(输入输出的定义):输入(InputStream) 和 输出(OutputStream) 经常容易让人混淆,因为,一个程序的输入,往往是一个程序的输出。
所以我们说的输入与输出都是相对于当前应用程序而言的
二、Java IO的用途和特征
结合上文,我们可以按照流的操作单元和流方向大体上可将流分为四个基本的流类,所有的流都继承这四个:
字节流 | 字符流 | |
---|---|---|
输入流 | InputStream | Reader |
输出流 | OutputStream | Writer |
java.io包除了这四个基本的抽象流类,除此外java.io包类还提供了大量的子类,每个子类都有其特定的功能与用处,大致分为以下用处:
- File Access ( 文件访问 )
- Network Access ( 网络访问 )
- Internal Memory Buffer Access ( 内存缓存访问 )
- Inter-Thread Communication (Pipes) ( 线程内部通信(管道) )
- Buffering ( 缓冲 )
- Filtering ( 过滤 )
- Parsing ( 解析 )
- Reading and Writing Text (Readers / Writers) ( 读写文本 )
- Reading and Writing Primitive Data (long, int etc.) ( 读写基本类型数据 例如long, int )
- Reading and Writing Objects ( 读写对象 )
java.io之所以提供了那么多子类,是因为java基于装饰模式的设计思想来设计io体系的,它为每个子类提供了很极小颗粒度功能的实现,这样当你需要使用流的某一特定功能时,能动态的装配这些Stream类,获取自己想要的流类。
装饰模式(Decorator Pattern) :动态地给一个对象增加一些额外的职责,就增加对象功能来说,装饰模式比生成子类实现更为灵活,是一个对象结构型模式。——刘伟主编的《设计模式(第2版)》
Byte Based Input | Byte Based Output | Character Based Input | Character Based Output | |
---|---|---|---|---|
Basic(基本) | InputStream | OutputStream | Reader InputStreamReader | Writer OutputStreamWriter |
Arrays(数组) | ByteArrayInputStream | ByteArrayOutputStream | CharArrayReader | CharArrayWriter |
Files(文件) | FileInputStream RandomAccessFile | FileOutputStream RandomAccessFile | FileReader | FileWriter |
Pipes(管道) | PipedInputStream | PipedOutputStream | PipedReader | PipedWriter |
Buffering(缓冲器) | BufferedInputStream | BufferedOutputStream | BufferedReader | BufferedWriter |
Filtering(过滤器) | FilterInputStream | FilterOutputStream | FilterReader | FilterWriter |
Parsing(解析) | PushbackInputStream StreamTokenizer | PushbackReader LineNumberReader | ||
Strings(字符串) | StringReader | StringWriter | ||
Data(日期) | DataInputStream | DataOutputStream | ||
Data - Formatted(格式化日期) | PrintStream | PrintWriter | ||
Objects(对象) | ObjectInputStream | ObjectOutputStream | ||
Utilities(工具) | SequenceInputStream |
三、流的使用详解
在整个Java.io包中最重要的就是5个类和一个接口。5个类指的是File、OutputStream、InputStream、Writer、Reader;一个接口指的是Serializable.掌握了这些IO的核心操作那么对于Java中的IO体系也就有了一个初步的认识了。
主要的类如下:
1. File(文件特征与管理):File类是对文件系统中文件以及文件夹进行封装的对象,可以通过对象的思想来操作文件和文件夹。 File类保存文件或目录的各种元数据信息,包括文件名、文件长度、最后修改时间、是否可读、获取当前文件的路径名,判断指定文件是否存在、获得当前目录中的文件列表,创建、删除文件和目录等方法。
2. InputStream(二进制格式操作):抽象类,基于字节的输入操作,是所有输入流的父类。定义了所有输入流都具有的共同特征。
3. OutputStream(二进制格式操作):抽象类。基于字节的输出操作。是所有输出流的父类。定义了所有输出流都具有的共同特征。
4. Reader(文件格式操作):抽象类,基于字符的输入操作。
5. Writer(文件格式操作):抽象类,基于字符的输出操作。
举例说明:InputStream
1.ByteArrayInputStream:字节数组输入流,该类的功能就是从字节数组(byte[])中进行以字节为单位的读取,也就是将资源文件都以字节的形式存入到该类中的字节数组中去,我们拿也是从这个字节数组中拿
2.PipedInputStream:管道字节输入流,它和PipedOutputStream一起使用,能实现多线程间的管道通信
3.FilterInputStream :装饰者模式中处于装饰者,具体的装饰者都要继承它,所以在该类的子类下都是用来装饰别的流的,也就是处理类。具体装饰者模式在下面会讲解到,到时就明白了
4.BufferedInputStream:缓冲流,对处理流进行装饰,增强,内部会有一个缓存区,用来存放字节,每次都是将缓存区存满然后发送,而不是一个字节或两个字节这样发送。效率更高
5. DataInputStream:数据输入流,它是用来装饰其它输入流,它“允许应用程序以与机器无关方式从底层输入流中读取基本 Java 数据类型”
6.FileInputSream:文件输入流。它通常用于对文件进行读取操作
7.File:对指定目录的文件进行操作,具体可以查看讲解File的博文。注意,该类虽然是在IO包下,但是并不继承自四大基础类。
8.ObjectInputStream:对象输入流,用来提供对“基本数据或对象”的持久存储。通俗点讲,也就是能直接传输对象(反序列化中使用)