Java基础学习笔记(十八)—— 转换流、对象操作流

news2024/11/13 13:24:06

转换流、对象操作流

  • 1 转换流
    • 1.1 构造方法
    • 1.2 指定编码读写
  • 2 对象操作流
    • 2.1 对象操作流概述
    • 2.2 对象序列化流
    • 2.3 对象反序列化流
    • 2.4 案例

1 转换流

1.1 构造方法

转换流就是来进行字节流和字符流之间转换的

在这里插入图片描述

  • InputStreamReader:是从字节流到字符流的桥梁,父类是Reader
    • 它读取字节,并使用指定的编码将其解码为字符
    • 它使用的字符集可以由名称指定,也可以被明确指定,或者可以接受平台的默认字符集
  • OutputStreamWriter:是从字符流到字节流的桥梁,父类是Writer
    • 使用指定的编码将写入的字符编码为字节
    • 它使用的字符集可以由名称指定,也可以被明确指定,或者可以接受平台的默认字符集

在这里插入图片描述

1.2 指定编码读写

public static void main(String[] args) throws IOException {
	//method1();
	//method2();

	//在JDK11之后,字符流新推出了一个构造,也可以指定编码表
	FileReader fr = new FileReader("C:\\Users\\apple\\Desktop\\a.txt", Charset.forName("gbk"));
	int ch;
	while ((ch = fr.read())!=-1){
		System.out.println((char) ch);
	}
	fr.close();
}

private static void method2() throws IOException {
	//如何解决乱码现象
	//文件是什么码表,那么咱们就必须使用什么码表去读取.
	//我们就要指定使用GBK码表去读取文件.
	//读文件
	InputStreamReader isr = new InputStreamReader(new FileInputStream("C:\\Users\\apple\\Desktop\\a.txt"),"gbk");
	int ch;
	while((ch = isr.read())!=-1){
		System.out.println((char) ch);
	}
	isr.close();

	//写文件,如果我们使用idea自动创建的文件并写内容,那么windows系统中默认该文件编码utf-8
	OutputStreamWriter osw = new OutputStreamWriter(new FileOutputStream("C:\\Users\\apple\\Desktop\\b.txt"),"UTF-8");
	osw.write("我爱学习,谁也别打扰我");
	osw.close();
}

//这个方法直接读取会产生乱码
//因为文件是GBK码表
//而idea默认的是UTF-8编码格式.
//所以两者不一致,导致乱码
private static void method1() throws IOException {
	FileReader fr = new FileReader("C:\\Users\\apple\\Desktop\\a.txt");
	int ch;
	while ((ch = fr.read())!=-1){
		System.out.println((char) ch);
	}
	fr.close();
}

2 对象操作流

2.1 对象操作流概述

需求:把这个用户信息保存到本地文件去

public static void main(String[] args) throws IOException {
	User user = new User("zhangsan","qwer");
	BufferedWriter bw = new BufferedWriter(new FileWriter("a.txt"));
	bw.write(user.getUsername());
	bw.newLine();
	bw.write(user.getPassword());
	bw.close();
}

但是,对于该例有个问题,就是将用户信息保存到本地文件后,任何人都可以看到这个信息,数据存在安全隐患,那么如何解决该问题呢?

对象操作流:

  • 可以把对象以字节的形式写到本地文件,直接打开文件,是读不懂的,需要再次用对象操作流读到内存中
  • 对象操作流分为两类:
    • 对象操作输出流(对象序列化流):就是将对象写到本地文件中 ,或者在网络中传输对象
    • 对象操作输入流(对象反序列化流):把写到本地文件中的对象读到内存中,或者接收网络中传输的对象

2.2 对象序列化流

  • 对象序列化介绍
    • 对象序列化:就是将对象保存到磁盘中,或者在网络中传输对象
    • 这种机制就是使用一个字节序列表示一个对象,该字节序列包含:对象的类型、对象的数据和对象中存储的属性等信息
    • 字节序列写到文件之后,相当于文件中持久保存了一个对象的信息
    • 反之,该字节序列还可以从文件中读取回来,重构对象,对它进行反序列化
  • 对象序列化流: ObjectOutputStream
    • 将Java对象的原始数据类型和图形写入OutputStream。 可以使用ObjectInputStream读取(重构)对象。 可以通过使用流的文件来实现对象的持久存储。 如果流是网络套接字流,则可以在另一个主机上或另一个进程中重构对象
  • 构造方法

在这里插入图片描述

  • 序列化对象的方法

在这里插入图片描述

  • 示例代码

User类

public class User implements Serializable {
	 //serialVersionUID 序列号
    //如果我们自己没有定义,那么虚拟机会根据类中的信息会自动的计算出一个序列号.
    //问题:如果我们修改了类中的信息.那么虚拟机会再次计算出一个序列号.

    //第一步:把User对象序列化到本地. --- -5824992206458892149
    //第二步:修改了javabean类. 导致 --- 类中的序列号 4900133124572371851
    //第三步:把文件中的对象读到内存. 本地中的序列号和类中的序列号不一致了.

    //解决?
    //不让虚拟机帮我们自动计算,我们自己手动给出.而且这个值不要变.
    //private static final long serialVersionUID = 1L;
    
    private String username;
    private String password;
    //private transient String password;

    public User() {
    }

    public User(String username, String password) {
        this.username = username;
        this.password = password;
    }

    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }

    @Override
    public String toString() {
        return "User{" +
                "username='" + username + '\'' +
                ", password='" + password + '\'' +
                '}';
    }
}

注意:

  • 如果想要这个类的对象能被序列化,那么这个类必须要实现一个接口Serializable(否则运行测试类会报错)
  • Serializable 接口的意义
    • 称之为是一个标记性接口,里面没有任何的抽象方法(实现一个接口就要实现里面所有的抽象方法)只要一个类实现了这个Serializable接口,那么就表示这个类的对象可以被序列化。
    • 实现该接口,不需要重写任何方法

测试类

public static void main(String[] args) throws IOException {
	User user = new User("zhangsan","qwer");

	ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("a.txt"));
	oos.writeObject(user);
	oos.close();
}

2.3 对象反序列化流

  • 对象反序列化流: ObjectInputStream

ObjectInputStream反序列化先前使用ObjectOutputStream编写的原始数据和对象

  • 构造方法

在这里插入图片描述

  • 反序列化对象的方法

在这里插入图片描述

  • 示例代码
public static void main(String[] args) throws IOException, ClassNotFoundException {
	ObjectInputStream ois = new ObjectInputStream(new FileInputStream("a.txt"));
	User o = (User) ois.readObject();
	System.out.println(o);
	ois.close();
}

用对象序列化流序列化了一个对象后,假如我们修改了对象所属的JavaBean类,读取数据会不会造成问题?

  • 会出问题,会抛出InvalidClassException异常

出了问题如何解决?

  • 重新序列化
  • 给对象所属的类加一个serialVersionUID
    • private static final long serialVersionUID = 42L;

如果一个对象中的某个成员变量的值不想被序列化,又该如何处理?

  • 给该成员变量加transient关键字修饰,该关键字标记的成员变量不参与序列化过程

2.4 案例

  • 案例需求
    • 创建多个学生类对象写到文件中,再次读取到内存中
  • 实现步骤
    • 创建序列化流对象
    • 创建多个学生对象
    • 将学生对象添加到集合中
    • 将集合对象序列化到文件中
    • 创建反序列化流对象
    • 将文件中的对象数据,读取到内存中
  • 代码实现

已存在标准类 Student 类

测试类1

public static void main(String[] args) throws IOException, ClassNotFoundException {
	Student s1 = new Student("杜子腾",16);
	Student s2 = new Student("张三",23);
	Student s3 = new Student("李四",24);

	ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("a.txt"));
	oos.writeObject(s1);
	oos.writeObject(s2);
	oos.writeObject(s3);

	oos.close();

	ObjectInputStream ois = new ObjectInputStream(new FileInputStream("a.txt"));
	Object obj;
  /*  while((obj = ois.readObject()) != null){// 对象输入流(反序列化流)的文件读取结束不可以用null来作为标志
		System.out.println(obj);
	}*/

   while(true){
	   try {
		   Object o = ois.readObject();
		   System.out.println(o);
	   } catch (EOFException e) {//EOFException异常表示在输入的过程中意外地到达文件结束或流结束
		   break;
	   }
   }
	ois.close();
}

测试类2

public static void main(String[] args) throws IOException, ClassNotFoundException {
	Student s1 = new Student("杜子腾",16);
	Student s2 = new Student("张三",23);
	Student s3 = new Student("李四",24);

	ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("a.txt"));
	ArrayList<Student> list = new ArrayList<>();
	list.add(s1);
	list.add(s2);
	list.add(s3);

	//我们往本地文件中写的就是一个集合
	oos.writeObject(list);

	oos.close();


	ObjectInputStream ois = new ObjectInputStream(new FileInputStream("a.txt"));
	ArrayList<Student> list2 = (ArrayList<Student>) ois.readObject();
	for (Student student : list2) {
		System.out.println(student);
	}
	ois.close();
}

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

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

相关文章

Linux(八)线程概念

1、线程的本质 线程就是一个进程内部的控制序列 是CPU进行执行调度的基本单元。&#xff08;调度一段代码的执行是通过线程完成的&#xff09; 一个进程中至少有一个线程&#xff08;所以进程与线程的数量关系是 一对一 或 一对多&#xff09; 2、为什么把线程称为LWP LWP…

数学建模之熵权法(SPSSPRO与MATLAB)

数学建模之熵权法&#xff08;SPSSPRO与MATLAB&#xff09;一、基本原理对于某项指标&#xff0c;可以用熵值来判断某个指标的离散程度&#xff0c;其信息熵值越小&#xff0c;指标的离散程度越大(表明指标值得变异程度越大&#xff0c;提供的信息量越多)&#xff0c;该指标对综…

Maxout 激活函数与 Max-Feature-Map (MFM)

前言 最近在读 A Light CNN for Deep Face Representation With Noisy Labels 提到 maxout 激活函数&#xff0c;虽然很好理解&#xff0c;激活的时候选取最大值即可&#xff0c;但是具体细节看了看相关的资料反倒混淆了。参考了一个相关的视频&#xff0c;大致屡清楚为什么说…

技术周 | qemu网络收发包流程

通常我们使用qemu创建虚拟机时&#xff0c;会使用下面的选项指定虚拟网卡设备的类型&#xff0c;以及桥接、tap设备参数等&#xff0c;如下&#xff1a; -device选项用于给虚拟机分配虚拟设备&#xff0c;如磁盘设备、网卡设备等 -netdev选项用于配置虚拟设备的后端&#xff0…

MACD底背离选股公式以及技术指标公式

今天介绍MACD底背离选股公式&#xff0c;整体来说编写难度比较大&#xff0c;按照MACD底背离的定义&#xff0c;需要分别找到2个价格波段低点以及快线DIF的2个低点&#xff0c;并进行比较&#xff0c;最终实现选股。 一、MACD底背离选股公式&#xff08;平替版&#xff09; 首先…

ES6 简介(一)

文章目录ES6 简介&#xff08;一&#xff09;一、 概述1、 导读2、 Babel 转码器2.1 是什么2.2 配置文件 .babelrc2.3 命令行转码2.4 babel-node2.5 babel/register2.6 polyfill2.7 浏览器环境二、 变量1、 let2、 const3、 ES6 声明变量4、 顶层对象的属性5、 globalThis 对象…

TCP协议面试灵魂12 问(二)

为什么不是两次&#xff1f; 根本原因: 无法确认客户端的接收能力。 分析如下: 如果是两次&#xff0c;你现在发了 SYN 报文想握手&#xff0c;但是这个包滞留在了当前的网络中迟迟没有到达&#xff0c;TCP 以为这是丢了包&#xff0c;于是重传&#xff0c;两次握手建立好了…

机器视觉高速发展催热人工智能市场,深眸科技深度布局把握新机遇

曾经&#xff0c;冰箱侧身的标签、空调背面不显眼的小螺丝、微波炉角落里的型号编码等质量检测&#xff0c;是工业生产线中最费人工、最难检测的“老大难”。这主要是因为我国家电行业长期以混产为主要生产方式&#xff0c;一条生产线上可能有几十种型号的钣金件产品同时经受质…

文档存储Elasticsearch系列--2 ES内部原理

前言&#xff1a;ES作为nosql 的数据存储&#xff0c;为什么它在承载PB级别的数据的同时&#xff0c;又可以对外提高近实时的高效搜索&#xff0c;它又是通过什么算法完成对文档的相关性分析&#xff1b;又是怎么保证聚合的高效性&#xff1b; 1 ES 分布式文档存储&#xff1a…

人工智能导论——谓词公式化为子句集详细步骤

在谓词逻辑中&#xff0c;有下述定义&#xff1a; 原子&#xff08;atom&#xff09;谓词公式是一个不能再分解的命题。 原子谓词公式及其否定&#xff0c;统称为文字&#xff08;literal&#xff09;。PPP称为正文字&#xff0c;P\neg PP称为负文字。PPP与P\neg PP为互补文字。…

MySQL实战作业示例:从离线文件生成数据库

前言 MySQL实战的课后作业&#xff0c;作业内容具体见 https://bbs.csdn.net/topics/611904749 截至时间是 2023年2月2日&#xff0c;按时提交的同学有一位。确实这次的作业非常有挑战性&#xff0c;作业用到的内容没有百分之百的学过&#xff0c;需要大家进行深入而有效的搜索…

【MyBatis】高级映射多对一,一对多和延迟加载

数据库准备:1. 多对一:多个学生对应一个班级(学生表是主表, 班级表是副表)多种实现方式, 常见的包括三种第一种方式&#xff1a; 一条sql语句, 级联属性映射// StudentMapper.xml // 一条sql语句, 级联属性映射 <resultMap id"studentResultMap" type"Studen…

Java当中的AQS

一、什么是AQS AQS的全称是:AbstractQueuedSynchronizer AQS是java当中的一个抽象类&#xff0c;用来构建锁和同步器。 例如我们常见的ReentrantLock&#xff0c;Semaphore等等都是通过AQS来构建的。 AQS的原理 如果被请求的共享资源没有被占用&#xff0c;那么就把请求资源…

spring boot集成xxl job

目录 1.xxl job介绍 2.搭建说明 (1)配置调度中心 (2)配置执行器 (3).执行 1.xxl job介绍 官网地址:分布式任务调度平台XXL-JOB XXL-JOB是一个分布式任务调度平台&#xff0c;其核心设计目标是开发迅速、学习简单、轻量级、易扩展。 2.搭建说明 环境搭建主要分为两个部分…

《深入浅出计算机组成原理》学习笔记 Day19

冒险和预测&#xff08;三&#xff09;乱序执行参考乱序执行 尽管代码生成的指令是顺序的&#xff0c;但是如果后面的指令和前面的指令独立&#xff0c;完全不需要等待前面的指令运算完成&#xff0c;可以先执行。 这种解决方案称为乱序执行&#xff08;Out-of-Order Executi…

程序加载与运行过程中的资源分配与管理

目录 程序的加载 程序的内存空间 程序入口地址 BSS段初始化 程序运行过程中的堆栈管理 栈内存管理 变量的作用域&#xff1a; 栈溢出攻击原理 Linux堆内存管理 查看进程内存布局 内存分配器 内存块合并 top chunk 程序的运行分两种情况&#xff1a;一种是在有操作…

矩阵理论复习(九)

A为正规矩阵时&#xff0c;A的奇异值是A的特征值的模。A为半正定Hermite矩阵时&#xff0c;A的奇异值是A的特征值。 最佳逼近解 最小二乘解 矩阵的单边逆 A是左可逆的充要条件是A为列满秩矩阵 A是左可逆的充要条件是NA{0} 投影矩阵N(A)R(I-A),N(I-A)R(A) A是右可逆的充要…

腾讯电子签小程序跳转(app 跳小程序,小程序跳小程序) Api

腾讯电子签 官网地址&#xff1a;腾讯电子签跳转 api 文档 let id‘yDw9jUUgyg34gq97U7WZ9b1rWEBV******’ let name ‘张**’ let phone ‘MTQ3NDU3Oidioidkl’ let path pages/guide?fromSFY&toMVP_CONTRACT_COVER&id${id}&name${name}&phone${phone} wx…

Echarts解决左右上下边距问题( 两种方法)

第007个点击查看专栏目录文章目录示例效果示例源代码&#xff08;共88行&#xff09;相关资料参考相应的设置参数&#xff08;方法1&#xff09;相应的设置参数&#xff08;方法2&#xff09;专栏介绍示例效果 没有添加grid之前&#xff08;有grid的默认值来控制&#xff09; …

Web 3 财富分配方式

文章作者&#xff1a;Andrew Beal每个星期四&#xff0c;Forta 基金会团队都会在 Zoom 上聚会&#xff0c;享受虚拟欢乐时光。我还没有亲自见过我的一些同事&#xff0c;所以这是我唯一一次了解他们在办公室之外的身份。每个人都有故事要讲&#xff0c;你只需要问。规则是 “我…