A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 严海荣 高级黑马   /  2012-9-24 21:33  /  1437 人查看  /  4 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 严海荣 于 2012-9-24 22:36 编辑
  1. BufferedWriter bufw = new BufferedWriter(new OutputStreamWriter(new FileOutputStream("d:\\d2.txt"));
  2.             BufferedWriter bufw = new BufferedWriter(new FileWriter("d:\\d2.txt"));
复制代码
第一句话是文件字节流转成字符流,包装后写入d2.txt。
第二句话是文件字符流,包装后写入d2.txt。
d2.txt是纯文本,那用第二个就可以了吧,第一个用到了转换流多次一举了,需要转换流,直接用字符流不就可以了吧,有些搞不懂?
什么时候用转换流,什么时候不用,有点搞不清楚了。

评分

参与人数 1技术分 +1 收起 理由
滔哥 + 1

查看全部评分

4 个回复

倒序浏览
通用性 因为很多情况下不一定是操作纯文本

评分

参与人数 1技术分 +1 收起 理由
滔哥 + 1

查看全部评分

回复 使用道具 举报
  • BufferedWriter bufw = new BufferedWriter(new FileWriter("d:\\d2.txt"));
        操作文本的话这个够用了,但是会出现一种特殊情况。
    就是码表FileWriter默认的码表是GBK,他会拿两个字节去查表再写入到“d2.txt”。而当你拿到的数据是UTF-8编码的话(三个字节一个字)就会出现错误。
  • 而OutputStreamWriter在转换的过程中可以指定编码表,比如UTF-8,格式为new OutputStreamWriter(new FileOutputStream("d:\\d2.txt"),"UTF-8");,不指定的时候默认是GBK编码。可以说FileWriter底层就是通过它实现的,只不过将码表给写死了。

评分

参与人数 1技术分 +1 收起 理由
滔哥 + 1

查看全部评分

回复 使用道具 举报
InputStreamReader 和OutputStreamWriter的最主要作用当然是主要用来转换字符编码了和转换字节字符流了
因为文本文件会有不同的编码格式,可能是系统的差异,也可能是在保存文件时采用特定的字符集编码来保存

用Java语言来打开这些文本时,如果不使用正确的字符集解码器打开,肯定会出现乱码
不过只要用了InputStreamReader类,就可以正确打开指定编码的文件了
下面代码为读取特定字符格式文件:

InputStream in = new FileInputStream("allfilename");  

InputStreamReader isr = new InputStreamReader(in, charsetName);  
BufferedReader br = new BufferedReader(isr);
同理,想以特定方式存储数据时,也可以用此outputStreamWriter存储,
下面代码为存为特定编码的文件
OutputStreamWriter out = new FileOutputStream("allfilename");  
out .write(OutputStream  out, String charsetName) ;

这样就可完成对于特定字符集编码的文档的读写(IO)操作。

评分

参与人数 1技术分 +1 收起 理由
滔哥 + 1

查看全部评分

回复 使用道具 举报
通过三个明确来完成。
1,明确源和目的。
源:输入流。InputStream  Reader
目的:输出流。OutputStream  Writer。
2,操作的数据是否是纯文本。
是:字符流。
不是:字节流。
3,当体系明确后,在明确要使用哪个具体的对象。
通过设备来进行区分:
源设备:内存,硬盘。键盘
目的设备:内存,硬盘,控制台。

如:将一个文本文件中数据存储到另一个文件中。复制文件。
源:因为是源,所以使用读取流。InputStream Reader
是不是操作文本文件。
是!这时就可以选择Reader
这样体系就明确了。
接下来明确要使用该体系中的哪个对象。
明确设备:硬盘。上一个文件。
Reader体系中可以操作文件的对象是 FileReader
是否需要提高效率:是!。加入Reader体系中缓冲区 BufferedReader.

FileReader fr = new FileReader("a.txt");
BufferedReader bufr = new BufferedReader(fr);


目的:OutputStream Writer
是否是纯文本。
是!Writer。
设备:硬盘,一个文件。
Writer体系中可以操作文件的对象FileWriter。
是否需要提高效率:是!。加入Writer体系中缓冲区 BufferedWriter

FileWriter fw = new FileWriter("b.txt");
BufferedWriter bufw = new BufferedWriter(fw);

如:将一个图片文件中数据存储到另一个文件中。复制文件。要按照以上格式自己完成三个明确。

---------------------------------------
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 bufw = new BufferedWriter(fw);

**************
扩展一下,想要把录入的数据按照指定的编码表(utf-8),将数据存到文件中。

目的:OutputStream  Writer
是否是存文本?是!Writer。
设备:硬盘。一个文件。使用 FileWriter。
但是FileWriter是使用的默认编码表。GBK.

但是存储时,需要加入指定编码表utf-8。而指定的编码表只有转换流可以指定。
所以要使用的对象是OutputStreamWriter。
而该转换流对象要接收一个字节输出流。而且还可以操作的文件的字节输出流。FileOutputStream
OutputStreamWriter osw = new OutputStreamWriter(new FileOutputStream("d.txt"),"UTF-8");
需要高效吗?需要。
BufferedWriter bufw = new BufferedWriter(osw);
所以,记住。转换流什么使用。字符和字节之间的桥梁,通常,涉及到字符编码转换时,
需要用到转换流。

总结一下:操作的是纯文本就用字符流,如果操作的不是纯文本就用字节流!如果字节流操作的对象是文本形式!那为了高效!可以转为字符流处理!
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马