美文网首页
Java IO之转换流的使用

Java IO之转换流的使用

作者: 程序员汪汪 | 来源:发表于2021-04-05 23:51 被阅读0次

    简介

    • 转换流提供了在字节流和字符流之间的转换。

    • Java API提供了两个转换流:

      • InputstreamReader:将Inputstream转换为Reader
      • OutputStreamWriter:将Writer转换为OutputStream
    • 字节流中的数据都是字符时,转成字符流操作更高效。

    • 很多时候我们使用转换流来处理文件乱码问题。实现编码和解码的功能。

    InputStreamReader

    InputStreamReader将一个字节的输入流转换为字符的输入流,解码:字节、字节数组 --->字符数组、字符串。

    构造器:

    • public InputStreamReader(InputStream in)
    • public InputStreamReader(Inputstream in,String charsetName):可以指定编码集。

    OutputStreamWriter

    OutputStreamWriter将一个字符的输出流转换为字节的输出流,编码:字符数组、字符串 ---> 字节、字节数组。

    构造器:

    • public OutputStreamWriter(OutputStream out)
    • public OutputStreamWriter(Outputstream out,String charsetName):可以指定编码集。

    图示:

    代码示例

    /**
    综合使用InputStreamReader和OutputStreamWriter
         */
    public class IsrAndOswTest {
    
        @Test
        public void test() {
    
            InputStreamReader isr = null;
            OutputStreamWriter osw = null;
            try {
                //1.造文件、造流
                File file1 = new File("D:\\io\\hello.txt");
                File file2 = new File("D:\\io\\hello_gbk.txt");
    
                FileInputStream fis = new FileInputStream(file1);
                FileOutputStream fos = new FileOutputStream(file2);
    
                isr = new InputStreamReader(fis, "utf-8");
                osw = new OutputStreamWriter(fos, "gbk"); 
                //2.读写过程
                char[] cbuf = new char[1024];
                int len;
                while ((len = isr.read(cbuf)) != -1) {
                    osw.write(cbuf, 0, len);
                }
            } catch (IOException e) {
                e.printStackTrace();
            } finally {
                // 3.关闭资源
                if (isr != null) {
                    try {
                        isr.close();
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                }
                if (osw != null) {
                    try {
                        osw.close();
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                }
            }
        }
    }
    

    说明:文件编码的方式(比如:GBK),决定了解析时使用的字符集(也只能是GBK)。

    编码集

    常见的编码表

    • ASCII:美国标准信息交换码。用一个字节的7位可以表示。
    • ISO8859-1:拉丁码表。欧洲码表用一个字节的8位表示。
    • GB2312:中国的中文编码表。最多两个字节编码所有字符
    • GBK:中国的中文编码表升级,融合了更多的中文文字符号。最多两个字节编码
    • Unicode:国际标准码,融合了目前人类使用的所字符。为每个字符分配唯一的字符码。所有的文字都用两个字节来表示。
    • UTF-8:变长的编码方式,可用1-4个字节来表示一个字符。

    说明:

    • 面向传输的众多UTF(UCS Transfer Format)标准出现了,顾名思义,UTF-8就是每次8个位传输数据,而UTF-16就是每次16个位。这是为传输而设计的编码,并使编码无国界,这样就可以显示全世界上所有文化的字符了。
    • Unicode只是定义了一个庞大的、全球通用的字符集,并为每个字符规定了唯一确定的编号,具体存储成什么样的字节流,取决于字符编码方案。推荐的Unicode编码是UTF-8UTF-16

    UTF-8变长编码表示

    编码应用

    • 编码:字符串-->字节数组。
    • 解码:字节数组-->字符串。
    • 转换流的编码应用:
      • 可以将字符按指定编码格式存储。
      • 可以对文本数据按指定编码格式来解读。
      • 指定编码表的动作由构造器完成。

    使用要求:

    客户端/浏览器端 <----> 后台(javaGOPythonNode.jsphp) <----> 数据库。

    要求前前后后使用的字符集都要统一:UTF-8

    相关文章

      网友评论

          本文标题:Java IO之转换流的使用

          本文链接:https://www.haomeiwen.com/subject/tbhckltx.html