美文网首页
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