字节流与字符流7(转换字节流字符流)

字符流虽然需要缓冲区进行处理,但是有一个问题千万不能够忽略,字符流能够输出字符串数据,所以有些时候就不得不进行字节流与字符流的操作转换(了解即可)

在java.io包里面提供有两个类:InputStreamReader,OutputStreamWriter.我们看看这两个类的定义和构造方法。

InputStreamReader
定义结构:public class InputStreamReader extends Reader
构造方法:public InputStreamReader(InputStrean in)

而InputStreamReader是Reader子类,通过构造函数将字节流变成了字符流

OutputStreamWriter
定义结构:public class OutputStreamWriter extends Writer
构造方法:public OutputStreamWriter(OutputStream out)
与上面同理。
范例:实现转换:

    public static void main(String[] args) throws Exception{
        //1.定义要输出的文件目录
        File file=new File("e:"+File.separator+"demo"+File.separator+"my.txt");
        if(!file.getParentFile().exists()){
            file.getParentFile().mkdirs();//如果文件不存在,创建文件
        }
        OutputStream outputStream=new FileOutputStream(file);
        //将outputstream类对象作为构造传入OutputStreamWriter,而后向上转型为Writer类对象
        Writer out=new OutputStreamWriter(outputStream);
        out.write("Hello World!");
        out.flush();
        out.close();
    }   

的确输出到了文件中Hello world!

之所采用这种方式转换,因为现在我们没有任何其它途径获得OutputStream类对象。所以此处是属于自己造了一个OutputStream。但是这种转换的意义不大,只有一种情况下有可能会用到这样的转换:方便处理中文数据。

观察:请观察类的继承结构
FileInputStream类的继承结构:
java.lang.Object
java.io.InputStream
java.io.FileInputStream

FileOutputStream类的继承结构:

java.lang.Object
java.io.OutputStream
java.io.FilterOutputStream

FileInputStream与OutputStream都是InputStream和OutputStream的直接子类。

接下来我们看看FileReader和FileWriter的继承结构:
FileReader:
java.lang.Object
java.io.Reader
java.io.InputStreamReader
java.io.FileReader

FileWriter:
java.lang.Object
java.io.Writer
java.io.OutputStreamWriter
java.io.FileWriter

这里出现了转换流,文件保存在磁盘上,磁盘上能够保存的文件形式都是以字节方式保存,而在使用字符流读取的时候,实际上也是对于字节数据进行读取,只不过这个转换过程被操作系统隐藏了,在缓冲区里面进行数据操作。

总结:
1.如果要进行转换,唯一可能出现的情况:处理中文

2.两个转换类都是字符流的子类,属于字符流与字节流的桥梁。

猜你喜欢

转载自blog.csdn.net/weixin_34378045/article/details/87040380