java的io问题:为什么要用OutputStreamWriter呢,字节流不好用,直接用字符流writer不就行了吗

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了java的io问题:为什么要用OutputStreamWriter呢,字节流不好用,直接用字符流writer不就行了吗相关的知识,希望对你有一定的参考价值。

套上了OutputStreamWriter,字节流不就变成字符流了吗,那为什么不直接用字符流呢,搞得要转换那么麻烦

你好,这种问题最好查看一下API帮助文档,那理讲的最详细,最直接。
OutputStreamWriter 是字符流通向字节流的桥梁:可使用指定的 charset 将要写入流中的字符编码成字节。它使用的字符集可以由名称指定或显式给定,否则将接受平台默认的字符集。
每次调用 write() 方法都会导致在给定字符(或字符集)上调用编码转换器。在写入底层输出流之前,得到的这些字节将在缓冲区中累积。可以指定此缓冲区的大小,不过,默认的缓冲区对多数用途来说已足够大。注意,传递给 write() 方法的字符没有缓冲。
为了获得最高效率,可考虑将 OutputStreamWriter 包装到 BufferedWriter 中,以避免频繁调用转换器。例如: Writer out= new BufferedWriter(new OutputStreamWriter(System.out));
参考技术A 这些都各有各的用法的,你现在直接操作字符,觉得字节流好用,但有的时候,并不是直接操作字符的,向下还有操作字节,操作位的情况。追问

套上了OutputStreamWriter,字节流不就变成字符流了吗,那和直接writer有区别吗

追答

有区别,有时候是不能套的,你的一个字节一个字节的进行修改,有时候甚至是一个二进制位一个二进制位的修改,不都是处理字符的。

追问

但是能套的时候,我直接用writer不是更方便么,为什么要特意用字符流在套一个OutputStreamWriter

转载JAVA中IO流操作的基本规律总结

流操作的基本规律:三个明确
1.明确源和目的;
源:输入流即读取流       InputStream,Reader
目的:输出流即写入流    OutputStream, Writer
2.明确操作的数据是否是纯文本文件;
如是果是纯文本文件使用字符流Reader 或Writer,不是纯文本文件 使用字节流InputStream或 OutputStream
3.当体系明确后,在明确具体的适用对象;
通过设备来区分
源设备:内存  硬盘  键盘
目的设备:内存  硬盘   控制台 
***************************************************************************************************
eg1:将一个文本文件的数据复制到另一个文件
分析开始:
源是一个文本文件所以使用字符流,因为要读取区其中的数据,选择Reader
接下来明确使用对象,设备是硬盘上的文件,Reader体系中操作文件的对象时FileReader
      FileReader fr=new FileReader("a.txt");
为了提高读取效率,加入Reader体系之中的缓冲区BufferedReader(装饰类)
BufferedReader br=new BufferedReader(fr);
目的:也是一个文件,因为要向其中写入数据,选择Writer
因为该文件也存在与硬盘之上,所以使用Writer体系中操作文件的对象FileWriter
FileWriter fw=new FileWriter("b.txt");
同理,为了提高读取效率,加入 Writer 体系之中的缓冲区BufferedWriter
Buffered Writer  br=new Buffered Writer r(fw);
若是图片、音频或是视频文件,分析步骤同上,改成相应的字节流即可。
********************************************************************************************************
eg2:将键盘录入的数据保存到文件当中
分析:源是键盘录入( InputStream,Reader),是纯文本(Reader);
设备:键盘,对应的对象System.in
由于体系是Reader,而System是字节流(InputStream),所以要转成字符流,利用Reader体系中的字节转字符的桥梁:InputStreamReader
InputStreamReader isr=new InputStreamReader(System.in);
为了提高效率,使用BufferedReader
BufferedReader br=new BufferedReader(isr); 
目的:也是文本文件,Writer
设备:硬盘上的文件,使用对象FileWriter
FileWriter fw=new FileWriter("a.txt");
同样为了提高效率:Buffered Writer  br=new Buffered Writer r(fw);
如果要将文本中的文件输出到控制台,按照上面的三个明确即可。
 
原文博客:http://blog.csdn.net/u012355386/article/details/22697155
浅显易懂,非常好用

以上是关于java的io问题:为什么要用OutputStreamWriter呢,字节流不好用,直接用字符流writer不就行了吗的主要内容,如果未能解决你的问题,请参考以下文章

转载JAVA中IO流操作的基本规律总结

java中生成了一个csv文件,通过excel打开csv,数据没有分列,如何在就java语言里实现。

一文带你入门Java Stream流,太强了

IOS开发 为啥要用block

PHP是什么?PHP可以做什么?为什么要用php?

iOS之NSString类型为什么要用copy修饰