Writer与OutputStream的区别

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/weixin_36570478/article/details/81871895

为了弄懂`Writer`与`OutputStream`的区别,首先要理解字节和字符(或者字节流和字符流)的区别;关于字节和字符的知识,我想Java 中字节流与字符流的区别?这篇文章已经将得非常详细了。

本文则从应用上做简单的补充:

首先以writer()方式向一个文件中写入一个字符串,由于writer()是为字符流设定的,所以在写入的时候我们可以指定字符串写入的编码格式,这里采用“UTF-16”格式:

private static void write(){
        File file = new File("./","write.txt");
        if (file.exists()){
            file.delete();
        }
        try {
            file.createNewFile();
            PrintWriter printWriter = new PrintWriter(new OutputStreamWriter(new FileOutputStream(file), Charset.forName("UTF-16")));
            printWriter.print("使用printWriter");
            printWriter.println();
            char[] charArray = { '使', '用', 'a', 'b', 'c' };
            printWriter.print(charArray);
            printWriter.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

然后我们打开`write.txt`文件的二进制内容:

如上图,4F7E即为“使”字的Unicode的编码,而文件头的`FEFF`则表明此文件中的数据流为大端模式(高位在低地址,低位在高地址),另外我们也可以看到Java默认的字符编码为UTF-16。

然后,再使用OutputStream实现类之一的FileOuptStream,对文件进行写入:

private static void stream(){
        File file = new File("./", "stream.txt");
        if (file.exists()){
            file.delete();
        }
        try {
            file.createNewFile();
            OutputStream outputStream = new FileOutputStream(file);
            outputStream.write("使用OutputStream".getBytes());
            outputStream.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

然后,打开"stream.txt",可以看出

E4 BD BF =‭ 11100100 10111101 10111111‬ (UTF-8) 

(Unicode) 01001111 01111111 = 4F7F。

扫描二维码关注公众号,回复: 3093808 查看本文章

getBytes()在不设置Charset参数时默认获取字符串的UTF-8字节数组。

在使用上Writer与OutputStream两者的区别则是,writer是用于写字符流的,所以不能直接接受byte[],OutputStream的实现类则是不直接接受字符流。同理,read()方法在reader中读出一个字符(char),在InputStream中读出一个byte。

然而,我们在使用InputStream时总是有 i = inputStream.read();(int i = 0),此时的read()读出一个byte并将byte赋值给i, i的最后一个byte即是read()读出的内容,我们使用 outputStream.wirite(int i),时,实际就是将i的最后一个byte写入。

所以,当需要批量读取时,Writer、Reader使用char[],InputStream、OutputStream使用byte[]。

猜你喜欢

转载自blog.csdn.net/weixin_36570478/article/details/81871895