接着上一篇写,一些补充。
其实毕老师的对字符流和字节流的使用分类总结还是很经典的,让你在不知道未使用什么流而抓耳挠腮时,有种豁然开朗的感觉。毕老师讲到:
流操作的基本规律:
最痛苦的就是流对象有很多,不知道该用哪一个。
通过仨个明确来完成。
1、明确源和目的。
源:输入流。InputStream Reader
目的:输出流。OutputStream Writer
2、操作的数据是否是纯文本。
是:字符流。Reader Writer
不是:字节流。InputStream OutputStream
3、当体系明确后,在明确要使用那个具体的对象。
通过设备来进行区分:
源设备:内存、键盘、硬盘。
目的设备:内存、硬盘、控制台。
1、将一个文本文件中的数据存储到另一个文件中,复制文件。
源:因为是源,所以使用读取流InputSteam Reader
是不是操作文本文件。
是!这是就可以选择Reader
这样系统就明确了。
接下来明确钥匙该体系中的那个对象
明确设备:硬盘上的一个文件。
Reader体系中可以操作文件的对象是FileReader
是否需要提高效率:是!加入Reader体系中的缓冲区 BufferedReader
FileReader fr = new FileReader("a.txt");
BufferedReader br = new BufferedReader(fr);
目的:OutputStream Writer
目的是否是纯文本的?
是!Writer。
明确设备:
设备:硬盘,一个文件。
Writer体系中可以操作文件的对象FileWriter。
是否需要提高效率:是!加入Writer体系中的缓冲区 BufferedWriter
FileWriter fw = new FileWriter("b.txt");
BufferedWriter bw = new BufferedWriter(fw);
练习:将一个图片文件中的数据存储到另一个文件中,复制文件。按照以上格式自己完成三个明确(和上一篇中拷贝一个mp3文件是一样的)
------------------------------------------------------------------------------------------
2、需求:将键盘录入的数据保存到一个文件中。
这个需求中有源和目的都存在。
那么分别分析
源:InputStream Reader
是不是纯文本?是!Reader
设备:键盘。对应的对象是System.in.
不是选择Reader吗?System.in对应的不是字节流吗?
为了操作键盘文本数据方便。转成字符流,按照字符串操作是最方便的。
所以,既然明确了Reader,就将System.in转成字符流Reader
用到了Reader体系中转换流InputStreamReader
InputStreamReader isr = new InputStreamReader(System.in);
需要提高效率吗?需要!BufferedReader
BufferedReader bufr = new BufferedReader(isr);
目的:OutputStream Writer
是否是纯文本?是!Writer。
设备:硬盘上的文件,使用FileWriter
FileWriter fw = new FileWriter("c.txt");
需要提高效率?需要!BufferedWriter
BufferedWriter bufw = new BufferedWriter(fw);
**********************************************************************************
扩展一下!!!想要把录入的数据按照指定的编码表(urf-8),将数据存到文件中。
目的:OutputStream Writer
是否是纯文本?是!Writer。
设备:硬盘上的文件,使用FileWriter
FileWriter使用的是默认表码表。GBK
但是存储时,需要加入指定编码表,而制定的编码表只有转换流可以指定。
所以要使用的对象是OutputStreamWriter。
而该转换流对象要接受一个字节输出流。而且还可以操作文件的字节输出流。FileOutputStream
FileOutputStreamWriter osw = new OutputStreamWriter(new FileOutputStream("d.txt"),"UTF-8");
需要提高效率?需要!BufferedWriter
BufferedWriter bufw = new BufferedWriter(osw);
所以记住,转换流是字符和字节的桥梁。通常,涉及到字符编码转换时,需要用到转换流。
------------------------------------------------------------------------------------------------------------
最痛苦的就是流对象有很多,不知道该用哪一个。
通过仨个明确来完成。
1、明确源和目的。
源:输入流。InputStream Reader
目的:输出流。OutputStream Writer
2、操作的数据是否是纯文本。
是:字符流。Reader Writer
不是:字节流。InputStream OutputStream
3、当体系明确后,在明确要使用那个具体的对象。
通过设备来进行区分:
源设备:内存、键盘、硬盘。
目的设备:内存、硬盘、控制台。
1、将一个文本文件中的数据存储到另一个文件中,复制文件。
源:因为是源,所以使用读取流InputSteam Reader
是不是操作文本文件。
是!这是就可以选择Reader
这样系统就明确了。
接下来明确钥匙该体系中的那个对象
明确设备:硬盘上的一个文件。
Reader体系中可以操作文件的对象是FileReader
是否需要提高效率:是!加入Reader体系中的缓冲区 BufferedReader
FileReader fr = new FileReader("a.txt");
BufferedReader br = new BufferedReader(fr);
目的:OutputStream Writer
目的是否是纯文本的?
是!Writer。
明确设备:
设备:硬盘,一个文件。
Writer体系中可以操作文件的对象FileWriter。
是否需要提高效率:是!加入Writer体系中的缓冲区 BufferedWriter
FileWriter fw = new FileWriter("b.txt");
BufferedWriter bw = new BufferedWriter(fw);
练习:将一个图片文件中的数据存储到另一个文件中,复制文件。按照以上格式自己完成三个明确(和上一篇中拷贝一个mp3文件是一样的)
------------------------------------------------------------------------------------------
2、需求:将键盘录入的数据保存到一个文件中。
这个需求中有源和目的都存在。
那么分别分析
源:InputStream Reader
是不是纯文本?是!Reader
设备:键盘。对应的对象是System.in.
不是选择Reader吗?System.in对应的不是字节流吗?
为了操作键盘文本数据方便。转成字符流,按照字符串操作是最方便的。
所以,既然明确了Reader,就将System.in转成字符流Reader
用到了Reader体系中转换流InputStreamReader
InputStreamReader isr = new InputStreamReader(System.in);
需要提高效率吗?需要!BufferedReader
BufferedReader bufr = new BufferedReader(isr);
目的:OutputStream Writer
是否是纯文本?是!Writer。
设备:硬盘上的文件,使用FileWriter
FileWriter fw = new FileWriter("c.txt");
需要提高效率?需要!BufferedWriter
BufferedWriter bufw = new BufferedWriter(fw);
**********************************************************************************
扩展一下!!!想要把录入的数据按照指定的编码表(urf-8),将数据存到文件中。
目的:OutputStream Writer
是否是纯文本?是!Writer。
设备:硬盘上的文件,使用FileWriter
FileWriter使用的是默认表码表。GBK
但是存储时,需要加入指定编码表,而制定的编码表只有转换流可以指定。
所以要使用的对象是OutputStreamWriter。
而该转换流对象要接受一个字节输出流。而且还可以操作文件的字节输出流。FileOutputStream
FileOutputStreamWriter osw = new OutputStreamWriter(new FileOutputStream("d.txt"),"UTF-8");
需要提高效率?需要!BufferedWriter
BufferedWriter bufw = new BufferedWriter(osw);
所以记住,转换流是字符和字节的桥梁。通常,涉及到字符编码转换时,需要用到转换流。
------------------------------------------------------------------------------------------------------------
/*
练习:讲一个文本数据打印到控制台上。按照以上格式自己完成三个明确
*/
public class TransStreamDemo
{
public static void main(String[] args) throws IOException
{
//System.setIn(new FileInputStream("PersonDemo.java"));
System.setOut(new PrintStream("zz.txt"));
//键盘录入最常见写法
BufferedReader bufr = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bufw = new BufferedWriter(new OutputStreamWriter(System.out));
String line = null;
while((line = bufr.readLine())!= null)
{
if("over".equals(line))
break;
bufw.write(line.toUpperCase());
bufw.newLine();
bufw.flush();
}
bufr.close();
}
}