1.流的概念
流:在 Java中所有数据都是使用流读写的。流是一组有顺序的,有起点和终点的字节集合,是对数据传 输的总称或抽象。即数据在两设备间的传输称为流,流的本质是数据传输,根据数据传输特性将流抽象 为各种类,方便更直观的进行数据操作。
1.按照流向分:输入流;输出流
2.按照处理数据的单位分:字节流(8位的字节);字符流(16位的字节)
2. 什么是输入输出流
输入就是将数据从各种输入设备(包括文件、键盘等)中读取到内存中。
输出则正好相反,是将数据写入到各种输出设备(比如文件、显示器、磁盘等)。
例如键盘就是一个标准的输入设备,而显示器就是一个标准的输出设备,但是文件既可以作为输入设 备,又可以作为输出设备。
3. 什么是字节流,字符流
File类不支持文件内容处理,如果要处理文件内容,必须要通过流的操作模式来完成。
在java.io包中,流分为两种:字节流与字符流
- 字节流:数据流中最小的数据单元是字节 。InputStream、OutputStream
- 字符流:数据流中最小的数据单元是字符, Java中的字符是Unicode编码,一个字符占用两个字节 。Reader、Writer
JavaIO类图
3.1.字节流
1.FileInputStream 和 FileOutputStream
public class FileInputStream extends InputStream {}
- FileInputStream 从文件系统中的某个文件中获得输入字节。
- FileInputStream 用于读取诸如图像数据之类的原始字节流。
方法 | 解释 |
---|---|
FileInputStream(Filefile) | 通过打开与实际文件的连接创建一个 FileInputStream ,该文 件由文件系统中的 File 对象 file 命名 |
FileInputStream(Stringname) | 通过打开与实际文件的连接来创建一个 FileInputStream ,该 文件由文件系统中的路径名 name 命名 |
public class FileOutputStream extends OutputStream
- 文件输出流是用于将数据写入到输出流 File 或一个 FileDescriptor 。 文件是否可用或可能被 创建取决于底层平台。
- 特别是某些平台允许一次只能打开一个文件来写入一个 FileOutputStream (或其他文件写入对 象)。
在这种情况下,如果所涉及的文件已经打开,则此类中的构造函数将失败。
方法 | 解释 |
---|---|
FileOutputStream(File file) | 创建文件输出流以写入由指定的 File 对象表示的文件 |
FileOutputStream(Stringname) | 创建文件输出流以指定的名称写入文件。 |
2、字节缓冲流 BufferedInputStream 和 BufferedOutputStream
问题:为什么需要有缓冲流?
答:当我们用read()读取文件时,每读一个字节,访问一次硬盘,效率很低 。文件过大时,操作
起来也不是很方便。因此我们需要用到buffer缓存流,当创建buffer对象时,会创建一个缓冲区
数组。当我们读一个文件时,先从硬盘中读到缓冲区,然后直接从缓冲区输出即可,效率会更高。
public class BufferedInputStream extends FilterInputStream
- BufferedInputStream 为另一个输入流添加了功能,即缓冲输入和支持 mark 和 reset 方法的功 能。 当创建
BufferedInputStream 时,将创建一个内部缓冲区数组。 - 当从流中读取或跳过字节时,内部缓冲区将根据需要从所包含的输入流中重新填充,一次有多个字 节。 mark 操作会记住输入流中的一点,并且
reset 操作会导致从最近的 mark 操作之后读取的所 有字节在从包含的输入流中取出新的字节之前重新读取。
方法 | 解释 |
---|---|
BufferedInputStream(InputStream in) | 创建一个 BufferedInputStream 并保存其参数,输 入流 in ,供以后使用。 |
BufferedInputStream(InputStream in,int size | 创建 BufferedInputStream 具有指定缓冲区大小,并保存其参数,输入流in,供以后使用 |
public class BufferedOutputStream extends FilterOutputStream
- 该类实现缓冲输出流。 通过设置这样的输出流,应用程序可以向底层输出流写入字节,而不必为 写入的每个字节导致底层系统的调用。
方法 | 解释 |
---|---|
BufferedOutputStream(OutputStreamout) | 创建一个新的缓冲输出流,以将数据写入指定 的底层输出流。 |
BufferedOutputStream(OutputStreamout, int size) | 创建一个新的缓冲输出流,以便以指定的缓冲 区大小将数据写入指定的底层输出流。 |
3.2 字符流
1.字符流 FileReader 和 FileWriter
public class FileReader extends InputStreamReader
- 如果要从文件中读取内容,可以直接使用 FileReader 子类。
- FileReader 是用于读取字符流。 要读取原始字节流,请考虑使用 FileInputStream 。
方法 | 解释 |
---|---|
FileReader(File file) | 创建一个新的 FileReader ,给出 File 读取。 |
FileReader(String fileName) | 创建一个新的 FileReader ,给定要读取的文件的名称。 |
public class FileWriter extends OutputStreamWriter
- 如果是向文件中写入内容,应该使用 FileWriter 子类
- FileWriter 是用于写入字符流。 要编写原始字节流,请考虑使用 FileOutputStream
方法 | 解释 |
---|---|
FileWriter(File file) | 给一个File对象构造一个FileWriter对象 |
FileWriter(String fileName) | 构造一个给定文件名的FileWriter对象 |
2、字符缓冲流 BufferedReader 和 BufferedWriter
为了提高字符流读写的效率,引入了缓冲机制,进行字符批量的读写,提高了单个字符读写的效率。 BufferedReader 用于加快读取字符的速度, BufferedWriter 用于加快写入的速度。
BufferedReader 和 BufferedWriter 类各拥有 8192个 字符的缓冲区。当 BufferedReader在 读取文 本文件时,会先尽量从文件中读入字符数据并放满缓冲区,而之后若使用read()方法,会先从缓冲区中 进行读取。如果缓冲区数据不足,才会再从文件中读取,使用 BufferedWriter 时,写入的数据并不会 先输出到目的地,而是先存储至缓冲区中。如果缓冲区中的数据满了,才会一次对目的地进行写出
public class BufferedReader extends Reader
- 从字符输入流读取文本,缓冲字符,以提供字符,数组和行的高效读取
方法 | 解释 |
---|---|
BufferedReader(Reader in) | 创建使用默认大小的输入缓冲区的缓冲字符输入 流 |
BufferedReader(Reader in, int sz) | 创建使用指定大小的输入缓冲区的缓冲字符输入 流 |
public class BufferedWriter extends Writer
- 将文本写入字符输出流,缓冲字符,以提供单个字符,数组和字符串的高效写入。
方法 | 解释 |
---|---|
BufferedWriter(Writer out) | 创建使用默认大小的输出缓冲区的缓冲字符输出流。 |
BufferedWriter(Writer out, int sz) | 创建一个新的缓冲字符输出流,使用给定大小的输出缓 冲区 |
3.3 字节流对比字符流
1 、字节流操作的基本单元是字节;字符流操作的基本单元为Unicode码元。
2、字节流在操作的时候本身不会用到缓冲区的,是与文件本身直接操作的;而字符流在操作的时候使 用到缓冲区的。
3、所有文件的存储都是字节(byte)的存储,在磁盘上保留的是字节。
4、在使用字节流操作中,即使没有关闭资源(close方法),也能输出;而字符流不使用close方法的 话,不会输出任何内容。
3.4 字符字节转换流
有时候我们需要进行字节流与字符流二者之间的转换,因为这是两种不同的流,所以,在进行转换的时 候我们需要用到 OutputStreamWriter 和 InputStreamReader 。
InputStreamReader 是Reader的子类,将输入的字节流转换成字符流
public class InputStreamReader extends Reader
-
InputStreamReader 是从字节流到字符流的桥:它读取字节,并使用指定的 charset 将其解码为 字符 。
-
它使用的字符集可以由名称指定,也可以被明确指定,或者可以接受平台的默认字符集。
方法 | 解释 |
---|---|
InputStreamReader(InputStream in) | 创建一个使用默认字符集的 InputStreamReader |
InputStreamReader(InputStream in,Charset cs) | 创建一个使用给定字符集的 InputStreamReader |
OutputStreamWriter 是Writer的子类,将输出的字符流转换成字节流。
public class OutputStreamWriter extends Writer
-
OutputStreamWriter 是字符的桥梁流以字节流:向其写入的字符编码成使用指定的字节 charset 。
-
它使用的字符集可以由名称指定,也可以被明确指定,或者可以接受平台的默认字符集。
方法 | 解释 |
---|---|
OutputStreamWriter(OutputStream out) | 创建一个使用默认字符编码的 OutputStreamWriter |
OutputStreamWriter(OutputStream out,Charset cs) | 创建一个使用给定字符OutputStreamWriter |