Java_IO流04:处理流之二:转换流

简介: Java_IO流04:处理流之二:转换流

@[toc]

处理流之二:转换流的使用

:o::Java API提供了两个转换流(处于字符体系之下,看后缀识别)

  • InputStreamReader:将InputStream转换为Reader(字节输入流转换为字符的输入流)
  • OutputStreamWriter:将Writer转换为OutputStream(字符的输出流转换为字节的输出流)

在这里插入图片描述

基本知识
  1. 基本了解
  • 转换流提供了在字节流和字符流之间的转换
  • 字节流中的数据都是字符时,转成字符流操作更高效
  • 很多时候我们使用转换流来处理文件乱码问题。实现编码和解码的功能。
  • 解码:字节、字节数组——>字符数组、字符串(看不懂的变成看得懂的叫解码)
  • 编码:字符数组、字符串——>字节、字节数组(看得懂的变成看不懂的叫编码)
InputStreamReader

:o::InputStreamReader

  • 实现将字节的输入流按指定字符集转换为字符的输入流。
  • 需要和InputStream“套接”
  • 构造器

    • 默认字符集:public InputStreamReader(InputStream in)
    • 指定字符集:public InputSreamReader(InputStream in,String charsetName)
    • 注:这里选择的字符集根据文件保存的时候的编码集决定
  • 处理异常仍然使用try-catch-finally

例子1:用字节流去读,然后用转换符转化为字符流

@Test
public void test1() {
    InputStreamReader isr2= null;//这里选择的字符集根据文件保存的时候的编码集决定
    try {
        FileInputStream fis = new FileInputStream("垃圾回收机制.txt");
        // InputStreamReader isr=new InputStreamReader(fis);//使用默认的编码集
        isr2 = new InputStreamReader(fis,"utf-8");

        //读到内存里面
        char[] chars = new char[20];
        int len;
        while ((len=isr2.read(chars))!=-1){
            String str=new String(chars,0,len);
            System.out.println(str);
        }
    } catch (IOException e) {
        e.printStackTrace();
    } finally {
        try {
            if (isr2!=null)
            isr2.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}
OutputStreamWriter

:o::OutputStreamWriter

  • 实现将字符的输出流按指定字符集转换为字节的输出流
  • 需要和OutputStream“套接”
  • 构造器

    • 默认字符集:public OutputStreamWriter(OutputStream out)
    • 指定字符集:public OutputSreamWriter(OutputStream out,String charsetName)

例子2:InputStreamReader和OutputStreamWriter综合使用,把utf-8存的文件以gbk复制

在这里插入图片描述

@Test
public void test2(){
    InputStreamReader isr= null;
    OutputStreamWriter osw= null;
    try {
        //1.造文件造流
        File file1 = new File("垃圾回收机制.txt");
        File file2 = new File("垃圾回收机制(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[] chars = new char[10];
        int len;
        while ((len=isr.read(chars))!=-1){
            osw.write(chars,0,len);
        }
    } catch (IOException e) {
        e.printStackTrace();
    } finally {
        //关闭资源
        try {
            if (osw!=null)
            osw.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
        try {
            if (isr!=null)
            isr.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}
编码集科普

编码表的由来:

  • 计算机只能识别二进制数据,早期由来是电信号。为了方便应用计算机,让它可以识 别各个国家的文字。就将各个国家的文字用数字来表示,并一一对应,形成一张表。 这就是编码表。

常见的编码表(字符集):

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

转换流的编码应用:

  • 可以将字符按指定编码格式存储
  • 可以对文本数据按指定编码格式来解读
  • 指定编码表的动作由构造器完成

补充:字符编码

  • Unicode不完美,这里就有三个问题,一个是,我们已经知道,英文字母只用 一个字节表示就够了,第二个问题是如何才能区别Unicode和ASCII?计算机 怎么知道两个字节表示一个符号,而不是分别表示两个符号呢?第三个,如果 和GBK等双字节编码方式一样,用最高位是1或0表示两个字节和一个字节, 就少了很多值无法用于表示字符,不够表示所有字符。Unicode在很长一段时 间内无法推广,直到互联网的出现。
  • 面向传输的众多 UTF(UCS Transfer Format)标准出现了,顾名思义,UTF8就是每次8个位传输数据,而UTF-16就是每次16个位。这是为传输而设计的 编码,并使编码无国界,这样就可以显示全世界上所有文化的字符了。
  • Unicode只是定义了一个庞大的、全球通用的字符集,并为每个字符规定了唯 一确定的编号,具体存储成什么样的字节流,取决于字符编码方案。推荐的 Unicode编码是UTF-8和UTF-16。
目录
相关文章
|
7月前
|
机器学习/深度学习 存储 人工智能
阿里云gpu云服务器实例gn7i、gn6i、gn6v、gn6e性能、适用场景与活动价格参考
阿里云GPU云服务器如gn7i、gn6i、gn6v和gn6e实例规格,适合不同的业务场景。gn7i适合高并发AI推理、云游戏及图形处理,gn6v专为深度学习训练和科学计算设计,gn6i则适合中等负载的AI推理和轻量级应用。2026年截至当前有包月5折、包年4折等优惠,用户可通过活动页面获取最新价格信息,并结合优惠券降低购买成本,灵活选择配置以满足不同业务需求。
2055 2
|
网络协议 算法 Java
【Java网络编程】网络编程概述、UDP通信(DatagramPacket 与 DatagramSocket)
【Java网络编程】网络编程概述、UDP通信(DatagramPacket 与 DatagramSocket)
427 3
|
SQL 关系型数据库 MySQL
【MySQL异常解决】MySQL执行SQL文件出现【Unknown collation ‘utf8mb4_0900_ai_ci‘】的解决方案
【MySQL异常解决】MySQL执行SQL文件出现【Unknown collation ‘utf8mb4_0900_ai_ci‘】的解决方案
1928 0
|
文字识别 算法 小程序
【项目总结】快瞳医疗化验单的OCR识别
快瞳科技通过图像识别技术,成功解决了医疗化验单OCR识别难题。项目要求精准识别表格内容,尤其是化验数值和名称,准确率达85%以上。针对化验单来源多样、干扰因素多的问题,团队采用智能文档抽取模型、opencv技术(如霍夫变换)进行图片扶正与裁剪,优化识别精度。最终,项目不仅达到药企要求,还实现超越,为医疗行业智能化转型提供了高性价比解决方案,助力快瞳科技在医疗信息化领域树立良好口碑。
1157 43
|
JSON Java 数据格式
Spring Boot返回Json数据及数据封装
在Spring Boot中,接口间及前后端的数据传输通常使用JSON格式。通过@RestController注解,可轻松实现Controller返回JSON数据。该注解是Spring Boot新增的组合注解,结合了@Controller和@ResponseBody的功能,默认将返回值转换为JSON格式。Spring Boot底层默认采用Jackson作为JSON解析框架,并通过spring-boot-starter-json依赖集成了相关库,包括jackson-databind、jackson-datatype-jdk8等常用模块,简化了开发者对依赖的手动管理。
928 3
|
JavaScript 前端开发 Java
115.【SpringBoot(IDEA)+Vue(Vscode)前后端交互】(一)
115.【SpringBoot(IDEA)+Vue(Vscode)前后端交互】
2028 0
|
文字识别 UED Python
对双栏 | 单双栏混合 | 图表文字混合的复杂布局的图片OCR识别(对布局复杂的整个pdf进行OCR识别)
这个故事告诉我们要多尝试不同的库和引擎,尤其是需求比较偏门或者少见的时候。同一个方向不同的库所擅长的领域是不一样的。 博客不应该只有代码和解决方案,重点应该在于给出解决方案的同时分享思维模式,只有思维才能可持续地解决问题,只有思维才是真正值得学习和分享的核心要素。如果这篇博客能给您带来一点帮助,麻烦您点个赞支持一下,还可以收藏起来以备不时之需,有疑问和错误欢迎在评论区指出~
|
Java Spring
SpringBoot入门(5) - 定制自己的Banner
SpringBoot入门(5) - 定制自己的Banner
821 0
 SpringBoot入门(5) - 定制自己的Banner
|
Serverless 计算机视觉
实战| 轻松实现仰卧起坐检测与计数,手把手教学【附完整源码与详细讲解】
实战| 轻松实现仰卧起坐检测与计数,手把手教学【附完整源码与详细讲解】
|
存储 人工智能 数据可视化
AI计算机视觉笔记二十一:PaddleOCR训练自定义数据集
在完成PaddleOCR环境搭建与测试后,本文档详细介绍如何训练自定义的车牌检测模型。首先,在`PaddleOCR`目录下创建`train_data`文件夹存放数据集,并下载并解压缩车牌数据集。接着,复制并修改配置文件`ch_det_mv3_db_v2.0.yml`以适应训练需求,包括设置模型存储目录、训练可视化选项及数据集路径。随后,下载预训练权重文件并放置于`pretrain_models`目录下,以便进行预测与训练。最后,通过指定命令行参数执行训练、断点续训、测试及导出推理模型等操作。
2049 3