黑马程序员技术交流社区
标题: io转换流问题 [打印本页]
作者: 严海荣 时间: 2012-9-24 21:33
标题: io转换流问题
本帖最后由 严海荣 于 2012-9-24 22:36 编辑
- BufferedWriter bufw = new BufferedWriter(new OutputStreamWriter(new FileOutputStream("d:\\d2.txt"));
- BufferedWriter bufw = new BufferedWriter(new FileWriter("d:\\d2.txt"));
复制代码 第一句话是文件字节流转成字符流,包装后写入d2.txt。
第二句话是文件字符流,包装后写入d2.txt。
d2.txt是纯文本,那用第二个就可以了吧,第一个用到了转换流多次一举了,需要转换流,直接用字符流不就可以了吧,有些搞不懂?
什么时候用转换流,什么时候不用,有点搞不清楚了。
作者: 尤圣回 时间: 2012-9-24 21:37
通用性 因为很多情况下不一定是操作纯文本
作者: 黑马张旭明 时间: 2012-9-24 21:59
- 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底层就是通过它实现的,只不过将码表给写死了。
作者: 张小龙 时间: 2012-9-24 22:08
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)操作。
作者: 罗磊 时间: 2012-9-25 08:33
通过三个明确来完成。
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);
所以,记住。转换流什么使用。字符和字节之间的桥梁,通常,涉及到字符编码转换时,
需要用到转换流。
总结一下:操作的是纯文本就用字符流,如果操作的不是纯文本就用字节流!如果字节流操作的对象是文本形式!那为了高效!可以转为字符流处理!
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) |
黑马程序员IT技术论坛 X3.2 |