/*
IO流操作基本规律:
1、明确源和目的
源:输入流。InputStream Reader
目的:输出流。OutputStream Writer
2、操作的数据是否是纯文本?
是:字符流
不是:字节流。
3、当体系明确后,再明确要使用哪个具体的对象。
通过设备来进行区分:
源设备:内存、硬盘、键盘
目的设备:内存、硬盘、控制台
/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\
/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\
例1、将一个文本文件中的数据存储到另一个文件中,复制文件。
分析:
-----------------------------------------------
源:以为是源,所以使用读取流。InputStream Reader
是不是操作文本文件?
是,这时就选择Reader
这样体系就明确了。
-----------------------------------------------
接下来,明确要使用该类体系的哪个对象。
明确设备:硬盘 上的一个文件。
Reader 体系中可以操作文件的对象时FileReader
// FileReader fr = new FileReader("a.txt");
是否需要提高效率呢?
是。加入Reader体统中的缓冲区 BufferedReader
//BufferedReader bufr = new BufferedReader(fr);
===============================================
目的:OutputStream 一个文件
是否是纯文本?
是。Writer
设备:硬盘 一个文件
Writer体系中可以操作问价的对象FileWriter
// FileWriter fw = new FileWriter("b.txt");
是否需要提高效率?
是。加入Writer体系的缓冲区 BufferedWriter
//BufferedWriter bufw = new BufferedWriter(fw);
*/
//标准录入输出
BufferedReader bufr = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bufw = new BufferedWriter(new OutputStreamWriter(System.out));
//文本文件到文件(复制)
//!!!注意:
//将字节流转为字符流的目的:方便操作,可以调用BufferedReader的readLine()方法整行读取。
BufferedWriter分行可调用newLine()方法。而非添加"\r\n"这个不跨平台!
BufferedReader bufr = new BufferedReader(new InputStreamReader(new FileInputStream("D:\\Demo.txt"),"UTF-8"));
BufferedWriter bufw = new BufferedWriter(new OutputStreamWriter(new FileOutputStream("D:"+File.sepatator+"b.txt"),"GBK"));
转换流:
InputStreamReader、OutStreamReader,在涉及到编码时,必须使用!
------------------------------------------------------ --------------------------------------------------------
类 InputStreamReader
java.lang.Object
java.io.Reader
java.io.InputStreamReader
-
直接已知子类:
-
FileReader
-
public class InputStreamReader extends
InputStreamReader(InputStream in) 创建一个使用默认字符集的 InputStreamReader。 |
InputStreamReader(InputStream in, Charset cs) 创建使用给定字符集的 InputStreamReader。 |
InputStreamReader(InputStream in, CharsetDecoder dec) 创建使用给定字符集解码器的 InputStreamReader。 |
InputStreamReader(InputStream in, String charsetName) 创建使用指定字符集的 InputStreamReader。 |
------------------------------------------------------- -------------------------------------------------------
类 OutputStreamWriter
java.lang.Object
java.io.Writer
java.io.OutputStreamWriter
-
直接已知子类:
-
FileWriter
-
public class OutputStreamWriter extends
构造方法摘要 | |
---|---|
OutputStreamWriter(OutputStream out) 创建使用默认字符编码的 OutputStreamWriter。 | |
OutputStreamWriter(OutputStream out, Charset cs) 创建使用给定字符集的 OutputStreamWriter。 | |
OutputStreamWriter(OutputStream out, CharsetEncoder enc) 创建使用给定字符集编码器的 OutputStreamWriter。 | |
OutputStreamWriter(OutputStream out, String charsetName) 创建使用指定字符集的 OutputStreamWriter。 |
个人总结:
1、java.IO包中的类 四个顶级抽象类:Reader Writer InputStream OutputStream
它们的子类都是由两个"单词"组成,第一个"单词"是功能,第二个"单词"表示所属的类。
2、字符流:专门用来处理文本。
字节流:通吃。文本需要编码解码时必须使用!
3、高效的Buffered
BufferedReader、BufferedWriter 、BufferedInputStream、BufferedOutputStream ,专门用来提高效率,作为装饰类,用来处理相应的流对象,使其功能增强。Buffered修饰的流类具有的readLine()方法,就是提高了原有流对象read()读取单个字符的效率。
注意:readLine()返回的是String类型,读完时返回 null;
而int read()读取的是字符或字节,返回的是读到的字符或字节的int类型的值;
而int read(参数)参数是字符数组或字节数组,将读到的字符或字节(从offf下标开始存入,长度为len的)数组,返回实际存入的字符数。
4、转码——字符流和字节流之间的桥梁
InputStreamReader —— 从字节流到字符流
OutputStreamWriter —— 从字符流到字节流
字节流中的数据都是字符时,转成字符流操作更高效。
5、个人发现:
读: 字符流 <----------- 字节流
写: 字符流 -----------> 字节流