黑马程序员_IO_字节流&转换流

----------- 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"));

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值