---------------------- android培训、java培训、期待与您交流! ----------------------
一:IO流概述与基本操作
IO流用于操作设备上数据的技术。
专门用于操作字符数据的流对象:
其实原理:字节流+编码表。
日后,只要操作的数据是文本,建议使用字符流更为方便。
字节流:
InputStream OutputStream
字符流:
Reader Writer
名称规律:
四个体系中的子类们,后缀名都是其所属体系顶层父类的名称,
前缀名都是该子类对象的功能体现。
需求:将一个字符串写入到硬盘的文件中。
既然是将一个字符串写入到一个外围设备上。
就要使用到流技术。
既然字符串是文本,所以可以使用字符流。
既然是往外部设备上写入,需要使用输出流。
即使字符流,又是输出流,哪个体系?Writer.
既然是往文件里写,Writer中是否有定义具体操作文件的子类对象。
Writer体系中有一个对象FileWriter.专门用操作文件的流对象。
接下来,先查阅一下Writer体系中共性方法。有写字符数组,字符,字符串的方法。
创建子类的对象。 FileWriter ,创建对象时,必须要查阅子类的构造方法摘要。
发现必须要明确数据的目的地。
二:流的操作规律:
目的:为了明确使用io流对象时,在具体需求下,该用哪个对象来解决问题。
其实通过几个明确来完成具体对象确定的。
明确一:明确数据源,还是数据目的(数据汇)。
数据源:意味着读,InputStream , Reader
数据目的:意味着写,OutputStream , Writer
明确二:明确要操作的数据是否是纯文本数据。
是纯文本:为了方便于文本操作建议使用字符流。
是纯文本,对于数据源:Reader
是纯文本,对于数据目的:Writer
不是纯文本呢?那还用废话吗?都是字节流嘛!
到了前两个明确,已经可以确定四个体系中一个。
接下来就是要搞清楚到底要用这个体系中的哪个对象。
明确三:明确数据所在的具体设备。
数据源:
硬盘:File打头。
内存:数组。
键盘:System.in
网络:Socket
数据目的:
硬盘:File前缀
内存:数组。
控制台:System.out.
网络:Socket
明确四:明确流操作时,是否需要额外功能?
高效? Buffered
转换?转换流。
...很多。 都是基本基础流之上来的功能流对象。
需求一:复制一个文本文件。
明确一:
既有源,又有目的。
源:InputStream Reader
目的:OuputStream Writer
明确二:
是否是纯文本?
是!
源:Reader
目的:Writer
明确三:
具体的设备是哪个?
源:硬盘,File
目的:硬盘 File
代码就出来了。
FileReader fr = new FileReader("a.txt");
FileWriter fw = new FileWriter("b.txt");
明确四:
需要额外功能不?
需要,高效!
BufferedReader bufr = new BufferedReader(new FileReader("a.txt"));
BufferedWriter bufw = new BufferedWriter(new FileWriter("b.txt"));
需求二:将键盘录入的数据存储到一个文件中。
明确一:
既有源,又有目的。
源:InputStream Reader
目的:OuputStream Writer
明确二:
是否是纯文本?
是!
源:Reader
目的:Writer
明确三:
具体设备:
源:键盘,System.in
目的:硬盘,File
InputStream in = System.in;
FileWriter fw = new FileWriter("a.txt");
这样是可以完成读写操作的。就是很麻烦。
明确四:
需要额外功能不?
转换。转换流。字节转成字符。InputStreamReader
InputStreamReader isr = new InputStreamReader(System.in);
FileWriter fw =new FileWriter("a.txt");
高效,Buffered
BufferedReader bufr = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bufw = new BufferedWriter(new FileWriter("a.txt"));
需求三:将一个文本文件打印在控制台上。
明确一:
既有源,又有目的。
源:InputStream Reader
目的:OuputStream Writer
明确二:
是否是纯文本?
是!
源:Reader
目的:Writer
明确三:
具体的设备:
源:硬盘,File
目的:控制台 ,System.out.
FileReader fr = new FileReader("a.txt");
OutputStream out = System.out;
char[] buf = new char[1024];
int len = fr.read(buf);
String str = new String(buf,0,len);
out.write(str.getBytes());
麻烦。
明确四:需要额外功能不?
转换:字符转成字节的对象。OutputStreamWriter
FileReader fr = new FileReader("a.txt");
OutputStreamWriter osw = new OutputStreamWriter(System.out);
高效:
BufferedReader bufr = new BufferedReader(new FileReader("a.txt"));
BufferedWriter bufw = new BufferedWriter(new OutputStreamWriter(System.out));
需求四:读取键盘录入数据,打印在控制台上。
自己写!
需求五:读取一个文本文件中的中文,将这些数据按照UTF-8的编码写入到文件中。
FileReader fr = new FileReader("a.txt");
这三句代码的效果一模一样。
FileWriter fw = new FileWriter("b.txt");//GBK. 这个子类对象的出现是为了便于操作字符文件,将本地默认码表+操作文件的字节流进行了封装。、
//但是这个子类也有局限性,1,必须是文件,2,固定码表 本地默认。
如果想要改变设备,或者码表必须用它的父类。以下两句。
OutputStreamWriter osw = new OutputStreamWriter(new FileOutputStream("b.txt"));//GBK
OutputStreamWriter osw = new OutputStreamWriter(new FileOutputStream("b.txt"),"GBK");//GBK
明确一:
既有源,又有目的。
源:InputStream Reader
目的:OuputStream Writer
明确二:
是否是纯文本?
是!
源:Reader
目的:Writer
明确三:
具体的设备:
源:硬盘,File
目的:硬盘,File
FileReader fr = new FileReader("a.txt");
FileWriter fw = new FileWriter("b.txt");
明确四:
需要额外功能吗?
必须,因为要明确指定的编码,所以目的就不可以使用FileWriter。因为它是固定的编码。
需要转换,字符-->字节。OutputStreamWriter
FileReader fr = new FileReader("a.txt");
//因为目的是文件。又是字节流类型。所以可以给转换流传入FileOutputStream
OutputStreamWriter osw = new OutputStreamWriter(new FileOutputStream("b.txt"),"UTF-8");
需要,高效。
BufferedReader bufr = new BufferedReader(new FileReader("a.txt"));// 是按照默认码表读取
BufferedWriter bufw = new BufferedWriter(new OutputStreamWriter(new FileOutputStream("b.txt"),"utf-8");
---------------------- android培训、java培训、期待与您交流! ----------------------
详细请查看:http://edu.youkuaiyun.com/heima