一,IO流的基本知识
Java中关于IO流的操作,根据操作数据的格式不同分为字节流,字符流。
①常用的字符流操作有InputStreamReader, OutputStreamWriter,BufferedReader,BufferedWriter。
InputStreamReader,OuputStreamWriter称为转换流,字节传换成字符操作。感觉不同的构造函数,创建不同的对象。如果不需要指定字符编码集,可以使用FileReader,FileWriter对文本文件进行操作。使用字符流操作的时候要记得刷新流操作,换行操作newLine也要在flush方法前使用。BufferedWriter,BufferedReader称为字符缓冲流,为了提高字符操作的效率而设。
指定UTF-8编码表写法:
OutputStreamWriter out = new OutputStreamWriter(new FileOutputStream("a.txt"),"UTF-8");
提高效率的写法:
BufferedWriter bufw = new BufferedWriter(new OutputStreamWriter(new FileOutputStream("a.txt"),"UTF-8"));
如果使用默认的字符编码表-GBK
FileWriter fw = new FileWriter("a.txt");
调高效率的写法:
BufferedWriter bufw = new BufferedWriter(new FileWriter("a.txt"));
指定UTF-8编码表写法:
InputStreamReader isr = new InputStreamReader(new FileInputStream("b.txt"),"UTF-8");
提高效率的写法:
BufferedReader bufr = new BufferedReader(new InputStreamReader(new FileInputStream("b.txt"),"UTF-8"));
如果使用默认的字符编码表-GBK
FileReader fr = new FileReader("b.txt");
调高效率的写法:
BufferedReader bufr = new BufferedReader(new FileReader("b.txt"));
②常用字节流FileInputStream,FileOutputStream,BufferedInputStream,BufferedOutputStream.
字节流用于操作图片或者媒体文件,字符流用于操作纯文本文件。
FileInputStream fis = new FileInputStream("c.gif");
FileOutputStream fos = new FileOutputStream("d.gif");
该缓冲区的字符流操作。
BufferedInputStream bis = new BufferedInputStream("c.gif");
BufferedOutputStream bos = new BufferedOutputStream("d.gif");
③终端操作
可以使用Java包中的System类中的方法进行终端操作。终端设备有,标准输入,标准输出,标准错误。这些操作都是面向字节的,如果需要提高效率可以使用转换流。
使用System的setIn,setOut,setErr方法可以进行终端重定向。
二,IO流的使用规律
分析一个问题首先要确定要操作对象的源和目的。
①,明确源和目的。
源:输入流。InputStream Reader
目的:输出流。OutputStream Writer
②,操作的数据时否是纯文本。
是:字符流。
不是:字节流。
③,当体系明确后在明确要使用哪个具体的对象。
通过设备来区分:
源设备:内存,硬盘,键盘。
目的设备:内存,硬盘,控制台。
实例分析一:
需求:将一个文件中的数据存储到另一个文件中。复制文件。
源:文本文件 Reader 体系明确,字符流。
接下明确对象,设备是硬盘 Reader体系中可以操作文件的FileReader。
目的:文本文件 Writer 体系明确,字符流。
明确设备:文件 Writer体系中可以操作文件的FileWriter。
FileReader fr = new FileReader("a.txt");
FileWriter fw = new FileWriter("b.txt");
是否需要提高效率:是!加入相应体系中的缓冲区。
BufferedReader fr = new BufferedReader(new FileReader("a.txt"));
BufferedWriter fw = new BufferedWriter(new FileWriter("b.txt"));
实例分析二:
需求:键盘录入的数据保存到一个文件中。
这个需求中有源和目的。
源:键盘 纯文本文件 选择字符流 Reader
设备:键盘 对应的对象时System.in。
不是选择Reader吗?System.in对应的不是字节流?
为了操作键盘的文本数据方便,转成字符流按照字符串操作最方便。
既然明确了Reader,那么就将System.in转化成Reader。用到了Reader体系中的
转换流,InputStreamReader
InputStreamReader isr = new InputStreamReader(System.in);
需要提高效率吗?需要!BufferedReader
BufferedReader bufr = new BufferedReader(isr);
目的:文件 纯文本 选择Writer
设备:硬盘,一个文件。使用FileWriter
FileWriter fw = new FileWriter("c.txt");
需要提高效率吗?是!BufferedWriter
BufferedWriter bufw = new BufferedWriter(fw);
************************************************************************
扩展一下,想要把录入的数据按照指定的编码表,将数据保持到文件中。
目的:文件 纯文本 选择Writer
设备:硬盘,一个文件。使用FileWriter
FileWrter使用默认编码表是GBK。
但是存储时需要加入指定的字符编码表,而指定的编码表只能转换流可以指定。
所以使用的对象是OutputStreamWriter。
而该转换对象要接收一个字节输出流,而且还可以操作文本的字节输出流、FileOutputStream。
OutputStreamWriter opw = new OutputStreamWriter(new FileOutputStream("d.txt"),"UTF-8");
需要提高效率吗?是!BufferedWriter
BufferedWriter bufw = new BufferedWriter(opw);
转换流什么时候使用?
字符与字节的桥梁,设计到字符编码转换时,需要用到转换流。
************************************************************************
阅读(2347) | 评论(0) | 转发(0) |