---------------------- ASP.Net+Android+IOS开发、.Net培训、期待与您交流! ----------------------
Java中的输入输出体系颇为庞大繁杂,刚接触很容易头大,各种接口各种类分辨不清。多总结归纳有助于记忆。
所谓输入输出,即数据从源流向目的的过程。Java把流封闭成对象,流与源和目的互动,达到输入输出的目的。
下面是几种常用的基本流对象
字符流
字符流的理解,由于很多国家的文字融入进来,比如说中文在编码表中默认占2个字节。(在UTF-8中是3个字节)而为了按照文字的单位来处理,所以出现了字符流。
由来:后期编码表的不断出现,识别某一文字的码表不唯一。比如中文,GBK&unicode都可以识别,就出现了编码问题,为了处理文字数据,就需要通过早期的字节流+编码表结合完成。
作用:为了更便于操作文字数据。
结论:只要是处理纯文本数据,就要优先考虑使用字符流,除此之外都是用字节流。
Reader:用于读取字符流的抽象类。子类必须实现的方法只有 read(char[], int, int) 和 BufferedReader:从字符输入流中读取文本,缓冲各个字符,从而实现字符、数组和行的高效读取。 可以指定缓冲区的大小,或者可使用默认的大小。大多数情况下,默认值就足够大了。
InputStreamReader:是字节流通向字符流的桥梁:它使用指定的 charset 读取字节并将其解码为字符。它使用的字符集可以由名称指定或显式给定,或者可以接受平台默认的字符集。
FileReader:用来读取字符文件的便捷类。此类的构造方法假定默认字符编码和默认字节缓冲区大小都是适当的。要自己指定这些值,可以先在 FileInputStream 上构造一个 InputStreamReader。
Writer:写入字符流的抽象类。子类必须实现的方法仅有 write(char[], int, int)、flush()和close()。
BufferedWriter:将文本写入字符输出流,缓冲各个字符,从而提供单个字符、数组和字符串的高效写入。
OutputStreamWriter:是字符流通向字节流的桥梁:可使用指定的 charset 将要写入流中的字符编码成字节。它使用的字符集可以由名称指定或显式给定,否则将接受平台默认的字符集。
FileWriter:用来写入字符文件的便捷类。此类的构造方法假定默认字符编码和默认字节缓冲区大小都是可接受的。要自己指定这些值,可以先在 FileOutputStream 上构造一个 OutputStreamWriter。
字节流
InputStream:是表示字节输入流的所有类的超类。
FileInputStream:从文件系统中的某个文件中获得输入字节。哪些文件可用取决于主机环境。FileInputStream 用于读取诸如图像数据之类的原始字节流。要读取字符流,请考虑使用 FileReader。
FilterInputStream:包含其他一些输入流,它将这些流用作其基本数据源,它可以直接传输数据或提供一些额外的功能。
BufferedInputStream:该类实现缓冲的输入流。
OutputStream:此抽象类是表示输出字节流的所有类的超类。
FileOutputStream:文件输出流是用于将数据写入 File 或 FileDescriptor 的输出流。
FilterOutputStream:此类是过滤输出流的所有类的超类。
BufferedOutputStream:该类实现缓冲的输出流。
Buffered缓冲区
Buffered缓冲区的实现使用了装饰设计模式,它把要装饰的对象作为构造参数传入。由于本身自带缓冲池,使得流对象不再频繁调用底层读入或写出数据,起到增加效率的强化作用。
以文本的复制为例
没有使用buffered缓冲区
- FileReader fr = new FileReader("demo.txt");
-
- FileWriter fw = new FileWriter("copycat.txt");
- char[] ch = char[1024]; //需要自建一个数组作为缓存
- int num = 0;
- while((num = fr.read(ch)!=-1)
- fw.write(ch,0,num);
- fw.close();
- fr.close();
-
使用buffered缓冲区
- BufferedReader bufr = new BufferedReader(new FileReader("demo.txt");
- BufferedWriter bufw = new BufferedReader(new FileWrite("copycat.txt");
- String line = null;
- while((line=bufr.readLine()!=null) //已有缓冲,并能提供一次读一行的方法
- {
- bufw.write(line);
- bufw.newLine();
- bufw.flush();
- }
- bufw.close;
- bufr.close;
-