----------- android培训、java培训、期待与您交流!------------
一、字节流
finalize() 方法是在垃圾收集器删除对象之前对这个对象调用的。
一旦垃圾收集器准备好释放对象占用的存储空间,它首先调用finalize(),而且只有在下一次垃圾收集过程中,才会真正回收对象的内存。
所以如果使用finalize(),就可以在垃圾收集期间进行一些重要的清除或清扫工作(如关闭流等操作)。
但JVM(Java虚拟机)不保证此方法总被调用。
字符流底层用的是字节流,字符流里面有字节流的缓冲区,因为它在操作文本型的字节数据时会查表
查表就会先把字节缓冲起来,对数据进行临时存储。所以需要刷新缓冲区才能得到数据。
字节流会原封不动的原始字节写到目的地,不需要缓冲。
二、转换流:字节流+编码表(可以指定)。
用于操作File的子类:字节流+本地默认码表(固定)。对默认编码的字符文件操作起来比父类更为便捷。
FileWriter fw = new FileWriter("temp\\default.txt");
=
FileOutputStream fos = new FileOutputStream("temp\\trans_default.txt");
OutputStreamWriter osw = new OutputStreamWriter(fos);
FileReader fr = new FileReader("temp\\default.txt");
=
FileInputStream fis = new FileInputStream("temp\\trans_default.txt");
InputStreamReader isr = new InputStreamReader(fis);
三、IO流的操作规律。
字符流:
FileReader
FileWriter
BufferedReader
BufferedWriter
InputStreamReader
OutputStreamWriter
字节流:
FileInputStream
FileOutputStream
BufferedInputStream
BufferedOUtputStream
用哪个流对象解决问题呢?
明确一:明确源和目的。
源:就需要读,就需要使用输入体系。InputStream Reader
目的:就需要写,就需要使用输出体系。OutputStream Writer
明确二:处理的数据是否是纯文本数据。
是:就使用字符流。
源:Reader
目的:Writer
否:就是用字节流。
源:InputStream
目的:OutputStream
两个明确都确定后,可以确定需要使用哪个体系。
明确三:具体是哪个设备,明确设备的目的是为了确定具体的对象。
源设备:
键盘,System.in
硬盘,操作文件的对象。File开头的流对象。
内存,数组ByteArrayInputStream CharArrayReader StringReader
网络,Socket
目的设备:
硬盘,操作文件的对象。File开头的流对象。
屏幕(控制台)System.out
内存,数组ByteArrayOutputStream CharArrayWriter StringWriter
网络,Socket
需求:将字符串数据写到硬盘上。
目的:OutputStream Writer
纯文本?是,Writer
设备?硬盘,FileWriter
FileWriter fw = new FileWriter("a.txt");
明确四:是否需要额外功能?
1,需要高效吗?BufferedInputStream BuffedOutputStream
2,需要字节和字符之间的桥梁吗?转换流。InputStreamReader OutputStreamWriter
3,需要保证数据输出时表现形式吗?PrintWriter PrintStream
4,需要对对象进行序列化和反序列化吗?ObjectInputStream ObjectOutputStream
5,需要操作基本数据类型值吗?DataInputStream DataOutputStream
6,需要进行数据的合并吗?SequenceInputStream
---------------------------------------------------
需求1:对文本文件进行复制。
明确1:源和目的。
源:InputStream Reader
目的:OutputStream Writer
明确2:是否是纯文本。
是!
源:Reader
目的:Writer
明确3:具体的设备。
源:硬盘。
目的:硬盘。
FileReader fr = new FileReader("a.txt");
FileWriter fw = new FileWriter("b.txt");
明确4:额外功能。
需要,高效。
BufferedReader bufr = new BufferedReader(new FileReader("a.txt"));
BufferedWriter bufw = new BufferedWriter(new FileWriter("b.txt"));
当然如果仅为复制文件,在该例中可以使用字节流完成。
需求2:读取键盘录入数据并保存到文件中。
明确1:源,目的。
源:InputStream Reader
目的:OutputStream Writer
明确2:是纯文本。
是!
源:Reader
目的:Writer
明确3:具体设备。
源设备:键盘。
目的设备:硬盘。
InputStream in = System.in;
//byte[] buf = new byte[1024];
//int len = in.read(buf);
//str = new String(buf);
FileWriter fw = new FileWriter("a.txt");
fw.write(str);
虽然可以用该代码完成,但是麻烦。
解决问题,源是字节流,目的是字符流。而最终确定的都是字符流体系。
源使用的Reader就可以了。怎么将源字节流转成字符流呢?
明确4:额外功能?
需要,转换。将字节流转成字符流。
InputStreamReader isr = new InputStreamReader(System.in);
FileWriter fw = new FileWriter("a.txt");
这时就需要定义一个字符数据作为缓冲。
还需要其他功能吗?需要,高效。
BufferedReader bufr = new BufferedReader(new InputStreamReader(System.in));//以后获取键盘录入,就使用该句。
BufferedWriter bufw = new BufferedWriter(new FileWriter("a.txt"));
String line = null;
while((line=bufr.readLine())!=null)
{
if("over".equals(line))
break;
bufw.write(line);
bufw.newLine();
bufw.flush();
}
需求3:读取硬盘上的文本文件将数据打印到屏幕上。
明确1:源,目的。
源:InputStream Reader
目的:OutputStream Writer
明确2:纯文本?
是!
源:Reader
目的:Writer。
明确3:具体设备:
源设备:硬盘。
目的设备:屏幕。
FileReader fr = new FileReader("a.txt");
PrintStream out = System.out;
明确4:额外功能。
高效!
BufferedReader bufr = new BufferedReader(new FileReader("a.txt"));
也希望目的也高效。想使用字符流的缓冲区对其高效。而System.out是字节流。
读到的字符,最终要转成成字节流,到System.out屏幕上。
需要用字符转成字节的桥梁。
BufferedWrier bufw = new BufferedWriter(new OutputStreamWriter(Sysetm.out));
需求4:读取一个文本文件,将数据转成UTF-8保存到另一个文件中。
明确1:源,目的。
源:InputStream Reader
目的:OutputStream Writer
明确2:纯文本?
是!
源:Reader
目的:Writer。
明确3:具体设备。
源:硬盘。
目的:硬盘。
FileReader fr = new FileReader("a.txt");
FileWriter fw = new FileWriter("b.txt");
源可以使用FileReader,因为可以使用默认本地编码。
而目的明确指定了编码表。就不可以使用FileWriter。
在字符转成字节的过程,需要加入编码。
明确4:需要额外功能?
需要,转换。
FileReader fr = new FileReader("a.txt");
//要转成可以操作文件的字节流。
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"));