IO的进阶

news2024/12/18 14:10:26

目录

  • 1. 字符流转向字节流的桥梁
    • 1.1 OutputStreamWriter
    • 1.2 InputStreamReader
    • 1.3 编码与解码
    • 1.4 常见编码方式
    • 1.5 编码与解码的注意事项
  • 2.Properties
    • 2.1概述
    • 2.2 Properties 的常用方法
    • 2.3 Properties 的应用场景
    • 2.4 实例
  • 3.序列化
    • 3.1 ObjectOutputStream
  • 4.字符编码
    • 4.1 ASCII
    • 4.2 GBK
    • 4.3 UTF-8
    • 4.4 编码与解码的注意事项

1. 字符流转向字节流的桥梁

Ascii中GBK码表

在这里插入图片描述

UTF-8 码表

在这里插入图片描述

在Java中,字符流和字节流之间需要进行转换,以便在不同的场合使用。OutputStreamWriter 和 InputStreamReader 分别用于将字符流转换为字节流,以及将字节流转换为字符流。

1.1 OutputStreamWriter

OutputStreamWriter 将字符流转换为字节流。其构造方法可以指定字符编码,例如 GBK 或 UTF-8,以支持不同语言字符的写入。

1.2 InputStreamReader

InputStreamReader 将字节流转换为字符流。其构造方法可以指定字符编码,以便正确解析不同语言字符的读取。

1.3 编码与解码

在计算机中,字符信息实际上是存储为二进制数据的。不同的编码方式会将字符映射到不同的二进制数值。例如,ASCII码将英文字符映射到0-127的数值,而GBK码则支持中文字符,并使用更宽的范围的数值。

1.4 常见编码方式

ASCII:美国信息交换标准码,主要用于英文字符。
GBK:国家标准GB 2312,支持简体中文。
UTF-8:Unicode Transformation Format 8,支持几乎所有语言字符,是目前最常用的编码方式。

1.5 编码与解码的注意事项

编码和解码必须使用相同的编码方式。例如,如果使用 GBK 编码写入文件,就必须使用 GBK 解码读取文件,否则会出现乱码。
UTF-8 编码可以兼容 ASCII 码,因此,对于纯英文文本,使用 UTF-8 编码是最佳选择。

public class ConverterDemo {


    public static void main(String[] args) {
        //创建字符流转换字节流的桥梁的对象
        OutputStreamWriter ow = null;

        try {
            //ow = new OutputStreamWriter(new FileOutputStream("b.txt"));
        	//字符流通向字节流的桥梁可以指定存储的编码
            ow = new OutputStreamWriter(new FileOutputStream("b.txt"),"GBK");
            ow.write("中");
            ow.flush();

        } catch (Exception e) {
            e.printStackTrace();
        }finally {
            try {
                if(ow != null){
                    ow.close();
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
}

2.Properties

2.1概述

Properties 类表示了一个持久的属性集。Properties 可保存在流中或从流中加载。属性列表中每个键及其对应值都是一个字符串。

特点:

1.继承于Hashtable,是线程安全的键值对存储结构

  1. Properties 可保存在流中或从流中加载
  2. 只能保存字符串的键值对。

2.2 Properties 的常用方法

  • load(InputStream inStream):从输入流中加载属性列表。
  • store(OutputStream outStream, String comments):将属性列表保存到输出流中,可以添加注释。
  • setProperty(String key, String value):设置属性值。
  • getProperty(String key):获取属性值。

2.3 Properties 的应用场景

  • 配置文件:用于存储应用程序的配置信息,例如数据库连接参数、用户设置等。
  • 国际化:用于存储不同语言的文本内容,例如界面提示信息、错误消息等。

2.4 实例

public class PropTest6 {
    public static void main(String[] args) {
        //创建一个Properties对象
        Properties prop = new Properties();
        InputStream in = null;
        try {
            //in = new FileReader("src/names.properties");                  in=PropTest6.class.getClassLoader().getResourceAsStream("names.properties");
             //从字节流中来加载数据到属性对象中
            prop.load(in);
            System.out.println(prop);
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            if(in != null){
                try {
                    in.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }
}

3.序列化

序列化流:

​ 对象输出流:ObjectOutputStream 将Java对象写入输出流中。要进行序列化的对象必须实现 Serializable 接口。

​ 对象输入流:ObjectInputStream 从输入流中读取Java对象。读取对象时,需要保证对象类与序列化时使用的类相同,并且具有相同的序列化版本号(serialVersionUID),ObjectInputStream 对以前使用 ObjectOutputStream 写入的对象进行反序列化。

3.1 ObjectOutputStream

我们要序列化的对象需要实现序列化接口

在这里插入图片描述

实现

在这里插入图片描述

我们一般会提供一个serialVersionUID

某个类序列化之后,如果类发生了 ,那么依然可以反序列化。

如果要是对多个对象来做序列化,一定要放在集合中。

4.字符编码

字符编码是将字符转换为二进制数值的过程,而解码则是将二进制数值转换回字符的过程。

存储:在计算机中存储字符都是存储的字符所对应的数值以二进制的形式表示。

展示:去相关的编码表中去查找该值(存储的值)所对应的字符。

4.1 ASCII

ASCII码是最早的字符编码标准,它使用7位二进制数表示128个字符,包括英文字母、数字、标点符号等。

在这里插入图片描述

4.2 GBK

GBK码用于存储中文的码表,是针对简体中文的编码标准,它使用双字节表示一个汉字,并可以兼容 ASCII码。

在这里插入图片描述

4.3 UTF-8

UTF-8编码最大的一张码表包含了所有的字符标准,UTF-8编码是一种可变长度的编码方式,它可以表示几乎所有语言的字符。UTF-8编码使用1-4个字节表示一个字符,英文字符使用1个字节,中文字符使用3个字节。

在这里插入图片描述

4.4 编码与解码的注意事项

编码和解码必须使用相同的编码方式。
UTF-8 编码可以兼容 ASCII 码。
选择合适的编码方式可以提高效率。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2261630.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【计算机网络】期末考试预习复习|中

作业讲解 转发器、网桥、路由器和网关(4-6) 作为中间设备,转发器、网桥、路由器和网关有何区别? (1) 物理层使用的中间设备叫做转发器(repeater)。 (2) 数据链路层使用的中间设备叫做网桥或桥接器(bridge)。 (3) 网络层使用的中间设备叫做路…

Edge Scdn用起来怎么样?

Edge Scdn:提升网站安全与性能的最佳选择 在当今互联网高速发展的时代,各种网络攻击层出不穷,特别是针对网站的DDoS攻击威胁,几乎每个行业都可能成为目标。为了确保网站的安全性与稳定性,越来越多的企业开始关注Edge …

UE4_控件蓝图_制作3D生命血条

一:效果图如下: 二、实现步骤: 1、新建敌人 右键蓝图类 选择角色, 重命名为BP_Enemytest。 双击打开,配置敌人网格体 修改位置及朝向 效果如下: 选择合适的动画蓝图类: 人物就有了动作&#x…

厦门凯酷全科技有限公司引领电商营销新风尚

在当今数字化经济快速发展的背景下,抖音作为领先的短视频和直播平台,已成为品牌推广和产品销售的重要渠道。厦门凯酷全科技有限公司(以下简称“凯酷全”)凭借其专业的团队和丰富的经验,专注于为客户提供高质量的抖音电…

高扬程潜水泵:大流量与高效率的完美结合|深圳鼎跃

洪水是由暴雨、风暴潮等等自然因素引起的江河湖海水量迅速增加或水位迅猛上涨的水流现象。一旦发生洪水事件,会侵袭河道沿岸的城市、农田等场景,在低洼地区容易形成积水,不仅影响人们的生活,还存在一定的安全风险。 高扬程潜水泵是…

神经网络基础-神经网络搭建和参数计算

文章目录 1.构建神经网络2. 神经网络的优缺点 1.构建神经网络 在 pytorch 中定义深度神经网络其实就是层堆叠的过程,继承自nn.Module,实现两个方法: __init__方法中定义网络中的层结构,主要是全连接层,并进行初始化。…

web网页前后端交互方式

参考该文&#xff0c; 一、前端通过表单<form>向后端发送数据 前端是通过html中的<form>表单&#xff0c;设置method属性定义发送表单数据的方式是get还是post。 如使用get方式&#xff0c;则提交的数据会在url中显示&#xff1b;如使用post方式&#xff0c;提交…

Mac配置 Node镜像源的时候报错解决办法

在Mac电脑中配置国内镜像源的时候报错,提示权限问题,无法写入配置文件。本文提供解决方法,青测有效。 一、原因分析 遇到的错误是由于 .npm 目录下的文件被 root 用户所拥有,导致当前用户无法写入相关配置文件。 二、解决办法 在终端输入以下命令,输入管理员密码即可。 su…

Linux实操篇-远程登录/Vim/开机重启

目录 传送门前言一、远程登录1、概念2、ifconfig3、实战3.1、SSH&#xff08;Secure Shell&#xff09;3.2、VNC&#xff08;Virtual Network Computing&#xff09;3.3、RDP&#xff08;Remote Desktop Protocol&#xff09;3.4、Telnet&#xff08;不推荐&#xff09;3.5、FT…

【C/C++进阶】CMake学习笔记

本篇文章包含的内容 一、CMake简介二、使用CMake构建工程2.1 一个最简单的CMake脚本2.2 使用变量和宏2.3 文件搜索 三、使用CMake制作和使用库文件3.1 静态库和动态库3.2 字符串操作3.3 CMake制作库文件3.4 CMake使用库文件3.4.1 使用link_libraries链接3.4.2 使用target_link_…

JS 生成防篡改水印

网页中有水印的需求&#xff0c;今天我们实现手写一个防篡改水印&#xff0c;先看下效果图&#xff1a; 一、创建class函数 传递一个dom为水印包裹器&#xff0c;有一些监听防篡改的observer&#xff0c;然后实例化的时候创建水印&#xff0c;执行create()方法 class WaterMa…

概率论得学习和整理26:EXCEL 关于plot 折线图--频度折线图的一些细节

目录 0 折线图有很多 1 频度折线图 1.1 直接用原始数据做的频度折线图 2 将原始数据生成数据透视表 3 这样可以做出了&#xff0c;频度plot 4 做按某字段汇总&#xff0c;成为累计plot分布 5 修改上面显示效果&#xff0c;做成百分比累计plot频度分布 0 折线图有很多 这…

实现echart大屏动画效果及全屏布局错乱解决方式

如何实现echarts动画效果?如何实现表格或多个垂直布局的柱状图自动滚动效果?如何解决tooltip位置超出屏幕问题,如何解决legend文字过长,布局错乱问题?如何处理饼图的中心图片永远居中? 本文将主要解决以上问题,如有错漏,请指正. 一、大屏动画效果 这里的动画效果主要指&…

pytest入门九:feature

fixture是pytest特有的功能&#xff0c;用以在测试执行前和执行后进行必要的准备和清理工作。使用pytest.fixture标识&#xff0c;定义在函数前面。在你编写测试函数的时候&#xff0c;你可以将此函数名称做为传入参数&#xff0c;pytest将会以依赖注入方式&#xff0c;将该函数…

C# 中的闭包

文章目录 前言一、闭包的基本概念二、匿名函数中的闭包1、定义和使用匿名函数2、匿名函数捕获外部变量3、闭包的生命周期 三、Lambda 表达式中的闭包1、定义和使用 Lambda 表达式2、Lambda 表达式捕获外部变量3、闭包的作用域 四、闭包的应用场景1、事件处理2、异步编程3、迭代…

ChatGPT客户端安装教程(附下载链接)

用惯了各类AI的我们发现每天打开网页还挺不习惯和麻烦&#xff0c;突然发现客户端上架了&#xff0c;懂摸鱼的人都知道这里面的道行有多深&#xff0c;话不多说&#xff0c;开整&#xff01; 以下是ChatGPT客户端的详细安装教程&#xff0c;适用于Windows和Mac系统&#xff1a…

GRE over IPSec 如何应用?如何在ensp上配置GRE over IPSec 实验?

GRE over IPSec应用场景 IPSec VPN本端设备无法感知对端有几个设备 &#xff0c;本端共用一个IPSec SA 。报文封装中没有对端设备的下一跳 &#xff0c;所以无法传输组播、广播和非IP报文 &#xff0c;比如OSPF协议 &#xff0c;导致分支与总部的内部网络之间无法使用OSPF路由…

概率论得学习和整理29: 用EXCEL 描述二项分布

目录 1 关于二项分布的基本内容 2 二项分布的概率 2.1 核心要素 2.2 成功K次的概率&#xff0c;二项分布公式 2.3 期望和方差 2.4 具体试验 2.5 概率质量函数pmf 和cdf 3 二项分布的pmf图的改进 3.1 改进折线图 3.2 如何生成这种竖线图呢 4 不同的二项分布 4.1 p0.…

leetcode 面试经典 150 题:三数之和

链接三数之和题序号11类型数组解题方法排序双指针法难度中等 题目 给你一个整数数组 nums &#xff0c;判断是否存在三元组 [nums[i], nums[j], nums[k]] 满足 i ! j、i ! k 且 j ! k &#xff0c; 同时还满足 nums[i] nums[j] nums[k] 0 。请你返回所有和为 0 且不重复的三…

【Linux】Nginx一个域名https一个地址配置多个项目【项目实战】

&#x1f468;‍&#x1f393;博主简介 &#x1f3c5;CSDN博客专家   &#x1f3c5;云计算领域优质创作者   &#x1f3c5;华为云开发者社区专家博主   &#x1f3c5;阿里云开发者社区专家博主 &#x1f48a;交流社区&#xff1a;运维交流社区 欢迎大家的加入&#xff01…