张小飞的Java之路——第四十四章——其他流对象

news2024/11/23 15:36:20

写在前面:

视频是什么东西,有看文档精彩吗?

视频是什么东西,有看文档速度快吗?

视频是什么东西,有看文档效率高吗?


诸小亮:这一节,我们介绍一下其他不常用的流对象

张小飞:既然不常用,还学习他们干嘛?

诸小亮:虽然不常用,但是偶尔也会用到,技多不压身嘛

Properties

诸小亮:Properties——HashTable的子类,存储键值对,可以把数据持久化到硬盘上

张小飞:哦?这得见识一下

基本演示

诸小亮:它的使用也很简答

public static void main(String[] args) throws IOException {
    Properties prop = new Properties();
    //1. 存储
    prop.put("yase","19");
    prop.put("daji","16");
    prop.put("change","20");
    
    //2. 遍历
    Set<String> names = prop.stringPropertyNames();
    for(String name : names){
        System.out.println(name + "----" + prop.get(name));
    }
    //修改数据
	//prop.setProperty("daji","18");
}

结果:
image.png

诸小亮:需要注意,只有键值都是String时,能使用 stringPropertyNames,否则:

image.png 结果:image.png

image.png 结果:image.png

张小飞:明白了,不过,您不是说他能把数据持久化到硬盘上吗?

持久化数据

诸小亮:当然了,首先看它的 list 方法

  • list:可以把Properties中的数据放到一个 OutputStream 中
public static void main(String[] args) throws IOException {
    Properties prop = new Properties();
    //1. 存储
    prop.put("yase","18");
    prop.put("daji","16");
    prop.put("change","20");

    //把内容输出到System.out中
    prop.list(System.out);
}

结果:image.png 注意:** list 方法一般用于测试**

张小飞:不行,这还是没有保存到文件中

诸小亮:看你急的,使用 store 就能存储数据了

public static void main(String[] args) throws IOException {
    Properties prop = new Properties();
    //1. 存储
    prop.put("yase","18");
    prop.put("daji","16");
    prop.put("change","20");

    //2. 把内容输出到文件中
    FileOutputStream out = new FileOutputStream("G:\\learn\\hero.properties");
    
    //3. 第一个参数是OutputStream对象,第二个参数是备注
    prop.store(out,"hero info");

    out.close();
}

结果:image.png

image.png
张小飞:原来输出后,key 和 value 用等号连接了起来

诸小亮:是的,其实——properties是 Java 中最常用的配置文件格式

张小飞:那,现在学习 properties 配置文件吗?

诸小亮:no no no,等到学Java的高级框架时候,才会讲这个

读取properties文件

张小飞:既然存到文件中,那么肯定也能从文件中读取吧

诸小亮:当然可以,使用 load 方法

public static void main(String[] args) throws IOException {
    Properties prop = new Properties();
    FileInputStream in = new FileInputStream("G:\\learn\\hero.properties");
    
    //1. 加载properties文件
    prop.load(in);

    //2. 遍历
    Set<String> names = prop.stringPropertyNames();
    for(String name : names){
        System.out.println(name + "----" + prop.get(name));
    }
    in.close();
}

结果:image.png

PrintStream

张小飞:这个 PrintStream 是???

诸小亮:PrintStream——字节打印流,可以把各种类型数据打印到目的地

张小飞:目的地?不是输出到文件中吗?

诸小亮:目的地可以是——File、OutputStream 等对象,包含文件

张小飞:原来是这样

诸小亮:其实我们早就用过这个对象了

张小飞:嗯?什么时候用过?

诸小亮:我们常用的 System.out 就是打印流:

image.png

写入文件

诸小亮:我们先尝试使用 PrintStream 往文件中存储数据

public static void main(String[] args) throws IOException {
    //1. 创建对象,指定目的地,有两种方式:
    PrintStream printStream = new PrintStream("G:\\learn\\hero.txt");
//        PrintStream printStream = new PrintStream(new File("G:\\learn\\hero.txt"));

    //2. 写入字节数据
    printStream.write("yase".getBytes());
    //3. 关闭流
    printStream.close();
}

结果:image.png

常用方法

write

诸小亮:write(int b)——每次写入一个字节

PrintStream printStream = new PrintStream("G:\\learn\\hero.txt");

//写入字节数据
printStream.write(97);//97对应的是a
printStream.write(353);

//关闭流
printStream.close();

结果:image.png

张小飞:嗯,怎么会这样??????

诸小亮:因为每次只是写入参数的最后一个字节,具体原因:

结果是:aa
	第一个 a 是 97,第二个 a 对用35397的二进制是:00000000 00000000 00000000 01100001
353转换成二进制是:00000000 00000000 00000001 01100001

因为该方法每次只写入一个字节,97353的最后一个字节一样,所以。。。。。

张小飞:明白了,不过每次只写入一个字节,太扯淡了,不能用这个方法

诸小亮:不错,所以它有提供了另一个方法

write

write(byte b[]):写入字节数组中的所有数据

如果就是想写入 “97” 这两个字符,可以使用这个方法,比如:

image.png

结果:image.png

print

print:可以打印各种类型数据到目的地中

image.png

public static void main(String[] args) throws IOException {
    //创建对象时,指定目的地,常用的两种方式:
    PrintStream printStream = new PrintStream("G:\\learn\\hero.txt");

    //打印各种类型数据,println比print多换行功能
    printStream.println(true);
    printStream.println(97);
    printStream.println("yase");
    printStream.println(3.14);
    printStream.println('c');
    //关闭流
    printStream.close();
}

结果:image.png

PrintWriter

张小飞:不用说了,PrintWriter——肯定是字符打印流,跟 PrintStream 类似

诸小亮:是的,它们的区别在于——PrintWriter 的 write 方法可以直接写入字符串

image.png

ObjectOutputStream

诸小亮:ObjectOutputStream——把 java 对象写入到文件中,称之为:序列化

张小飞:哦?怎么把对象写到文件中?

诸小亮:来,看下面的代码

class Hero {
    String name;
    public Hero (String name){
        this.name = name;
    }
    @Override
    public String toString() {
        return "Hero{" +
                "name='" + name + '\'' +
                '}';
    }
}

public static void main(String[] args) throws IOException {
    //1. 目的地
    FileOutputStream out = new FileOutputStream("G:\\learn\\hero.txt");
    //2. 使用ObjectOutputStream封装FileOutputStream
    ObjectOutputStream objOut = new ObjectOutputStream(out);

    //3. 写入java对象
    Hero hero = new Hero("yase");
    objOut.writeObject(hero);

    //4. 关闭流
    objOut.close();
}

结果:

image.png

张小飞:您这不是报错了吗?

诸小亮:这时因为 Hero 对象没有实现 Serializable 接口,所以不能序列化

张小飞:Serializable 是什么?

诸小亮:Serializable——序列化标识接口,该接口没有任何方法

image.png

诸小亮:但是只有实现Serializable接口的类,才能序列化

张小飞:明白了

诸小亮:修改Hero类,让其实现 Serializable
image.png

张小飞:我又运行了一些,虽然没有报错,但是文件打开是这样子的

image.png

诸小亮:因为 java 对象不是文本数据,所以使用记事本打开会乱码

ObjectInputStream

诸小亮:ObjectInputStream——从文件中读取对象,称之为:反序列化

public static void main(String[] args) throws IOException, ClassNotFoundException {
    //目的地
    FileInputStream in = new FileInputStream("G:\\learn\\hero.txt");
    ObjectInputStream objIn = new ObjectInputStream(in);

    //从文件中读取对象
    Hero o = (Hero) objIn.readObject();
    System.out.println(o.toString());
}

结果:

image.png

张小飞:怎么又报错了? Hero 不是已经实现了 Serializable 接口了吗?

诸小亮:这时因为,缺少一个静态变量serialVersionUI

张小飞:这是????

诸小亮:serialVersionUID: 序列化的版本号,实现Serializable接口,都应该有个这样的静态变量
image.png

注意:变量的值随意
再次序列化后,再次读取image.png

transient

张小飞:transient 是什么意思?

诸小亮:transient——瞬态关键字,瞬态:瞬间状态

张小飞:这是干什么的?

诸小亮:如果有些字段不想被序列化到文件中,可以使用这个修饰符,比如:

image.png

张小飞:您的意思是,这样 name 字段就不会序列化的文件中了?

诸小亮:是的,使用 transient 后,name字段只存在于内存中,不会被写到文件中

再次运行 序列化 和 反序列化,结果:

image.pngimage.png

ByteArrayInputStream 和 ByteArrayOutputStream

张小飞:这是——字节数组–输入输出流?

诸小亮:是的,其实就是用 IO 的读写思想,操作数组

  • ByteArrayInputStream :字节数组输入流,是InputStream的子类

张小飞:什么意思?

诸小亮:之前都是从文件中读取数据,而ByteArrayInputStream,从是字节数组中读取

image.png
张小飞:明白了,所以创建对象时,要传递一个字节数组进去

诸小亮:是的,另外还有 ByteArrayOutputStream

  • ByteArrayOutputStream :字节数组输出流,是 OutputStream 的子类
  • 作用:把数据写到其内部的一个 byte 数组中

张小飞:那是一个可变数组吧

诸小亮:不错,内部的数组会随着数据的不断写入而自动增长

张小飞:能演示一下吗?

诸小亮:当然可以

public static void main(String[] args) throws IOException, ClassNotFoundException {
    ByteArrayInputStream bin = new ByteArrayInputStream("yase".getBytes());
    ByteArrayOutputStream bout = new ByteArrayOutputStream();
    int ch =0;
    //从ByteArrayInputStream读出,写到ByteArrayOutputStream中
    while((ch = bin.read()) != -1){
        //写入内部数组中
        bout.write(ch);
    }
    //获取ByteArrayOutputStream中的数据
    System.out.println(bout.toString());
}

张小飞:您没有关闭流对象

诸小亮:这两对象操作的都是内存,比较特殊,所以不用close

张小飞:明白了

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

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

相关文章

SAP-MM-分割评估-评估类型-评估类别

同一物料的使用&#xff0c;既有“自制品”&#xff0c;又有“外购品”&#xff0c;并且其来源不同&#xff0c;如同一外购品由不同的供应商提供&#xff0c;价格也不相同。也就是说:同一物料有不同的价值指派&#xff0c;即在不同的条件下&#xff0c;同一物料可能有不同的价值…

智能型数字档案馆构建设想

档案作为企业正式权威的数据资源&#xff0c;具有其历史传承和凭证唯一性等特点&#xff0c;随着企业的数字化转型&#xff0c;档案工作更需要数字化转型&#xff0c;档案管理与利用急需借助信息技术手段来管理好和记录好&#xff0c;急需挖掘档案资源&#xff0c;发挥其价值&a…

01.硬盘启动盘,加载操作系统

硬盘启动盘&#xff0c;加载操作系统 模拟硬盘加载操作系统 环境&#xff1a; VMware16 Ubuntu16.04 qemu bochs 2.7 参考: 启动&#xff0c;BIOS&#xff0c;MBR 硬盘控制器主要端口寄存器 《操作系统真相还原》 1.系统开机流程 暂不构建中断向量表&#xff0c;直接加载MBR …

Knowledge Distillation: A Survey

本文是蒸馏学习综述系列的第一篇文章&#xff0c;主要是针对2021年 IJCV Knowledge Distillation: A Survey的一个翻译。 知识蒸馏&#xff1a;综述 摘要1 引言2 知识2.1 基于响应的知识2.2 基于特征的知识2.3 基于关系的知识 3 蒸馏方案3.1 离线蒸馏3.2 在线蒸馏3.3 自蒸馏 4…

你真的了解epoll吗?深入epoll的五个问题

由于epoll用的比较多&#xff0c;最近看到一些网友关于epoll的问答&#xff0c;所以我就想整理成一篇文章&#xff0c;这样看起来和理解起来都方便一些。 问题1&#xff1a;什么是epoll的ET/LT模式&#xff0c;select/poll支持吗&#xff1f; ET是edge trigger&#xff0c;也…

K8s in Action 阅读笔记——【9】Deployments: updating applications declaratively

K8s in Action 阅读笔记——【9】Deployments: updating applications declaratively 集群配置&#xff1a; 本章介绍如何更新运行在Kubernetes集群中的应用&#xff0c;以及Kubernetes如何帮助你实现真正的零停机更新过程。虽然这可以仅使用ReplicationControllers或ReplicaSe…

【Spring】javaBean、依赖注入、面向切面AOP、使用注解开发

文章目录 JavaBeanIoC理论基础使用IoC容器使用Spring 生命周期与继承生命周期继承 依赖注入 Dependency Injection基本类型注入非基本类型注入集合注入自动装配注入 面向切面AOP使用SpringAOP环绕方法 使用接口实现AOP 使用注解开发注解实现配置文件注解实现AOP操作其他注解配置…

MongoDB6.0.6 副本集搭建(CentOs8)

本文只说如何操作配置副本集&#xff0c;历程艰难&#xff0c;官网文档看了半天也只说了怎么添加单个&#xff0c;没有给出来一个完整的流程。 1.第一步安装&#xff0c;参考前一篇安装即可。 配置三台虚拟机&#xff1a; 192.168.182.142 192.168.182.143 192.168.182.14…

钉钉小程序页面之间传递数据如何传递对象

今天写代码的时候&#xff0c;发现了一个问题&#xff0c;在钉钉小程序页面之间传递对象数据的时候&#xff0c;如果直接传递一个对象那个的话&#xff0c;接收的那个页面得到的是一个【object Object】&#xff0c;而并非里面的数据&#xff0c;所以针对上述问题&#xff0c;下…

基于Spring Boot的学生志愿者管理系统的设计与实现

摘 要 信息化社会内需要与之针对性的信息获取途径&#xff0c;但是途径的扩展基本上为人们所努力的方向&#xff0c;由于站在的角度存在偏差&#xff0c;人们经常能够获得不同类型信息&#xff0c;这也是技术最为难以攻克的课题。针对学生志愿者管理等问题&#xff0c;对学生…

项目计划软件 project安装包的下载和安装教程

目录 简介 安装配置过程 总结&#xff1a; 简介 Project是由微软公司开发的项目管理软件&#xff0c;旨在帮助个人和团队有效地管理项目进度、资源分配、协作和报告等工作&#xff0c;从而提高项目的质量和效率。Project维护项目的进程表、资源清单、成本预算、工作表和报告…

CSS-HTML知识点与高频考题解析

知识点梳理 选择器的权重和优先级 盒模型 盒子大小计算margin 的重叠计算 浮动 float浮动布局概念清理浮动 定位 position文档流概念定位分类fixed 定位特点绝对定位计算方式 flex布局 如何实现居中对齐&#xff1f; 理解语义化 CSS3 动画 重绘和回流 选择器的权重和优…

VTK 开发中遇到问题整理

1 Generic Warning VTK 开发 中是到 vtkOutputWindow 弹窗并提示Generic Warning&#xff1a;… vtkOutputWindow 弹窗 解决方法&#xff1a; 添加&#xff1a; #include <vtkOutputWindow.h> 在 main.cpp函数中添加&#xff1a; vtkOutputWindow::SetGlobalWarningD…

petalinux2022.2在ubantu20.04下的安装

1.Petalinux的下载路径 Downloads 这个是下载petalinux的官网路径。默认是2022.2版本&#xff0c;后期更新的均是以petalinux2022.2版本做的更新。 2.安装流程 在官网下载完成之后&#xff0c;会得到一个名为petalinux-v2022.2-10141622-installer.run的文件&#xff0c;这个文…

linux|磁盘管理工作|lvm逻辑管理卷的创建和使用总结(包括扩容,根目录扩容演示)

前言&#xff1a; 对于运维工作来说&#xff0c;磁盘管理是一个非常重要的工作。当然了&#xff0c;此类工作也是比较偏向底层的一项工作。 一个合理的磁盘分区设置&#xff0c;文件系统格式&#xff0c;以及准确的lvm逻辑管理会对我们的后期的扩展工作&#xff0c;管理工作带…

深入理解设计原则之单一职责原则(SRP)【软件架构设计】

系列文章目录 C高性能优化编程系列 深入理解软件架构设计系列 深入理解设计模式系列 高级C并发线程编程 SRP&#xff1a;单一职责原则 系列文章目录1、单一职责原则的定义和解读2、单一职责原则案例解读2.1、违背单一职责原则反面案例2.2、违背单一职责原则反面案例 - 解决方…

Openwrt_XiaoMiR3G路由器_刷入Breed固件

当我刷完Breed后&#xff0c;重启没有进入原来的小米路由器固件&#xff0c;但可以进入breed控制台。目前不清楚那个环节出错了。所以本过程会导致路由器无法再直接使用&#xff01;&#xff01;&#xff01;。 本过程只刷入Breed&#xff0c;接着编译OpenWrt和刷入OpenWrt请参…

git命令的使用

1. 查看文件 git cat-file -p 仓库路径下右键 Git Bash Here 打开git命令窗口&#xff1a; 复制某个文件的版本号&#xff1a; 粘贴到git命令窗口&#xff0c;会显示文件的提交信息&#xff1a; 查看 tree后面的版本号&#xff0c;则会看到详细提交信息&#xff1a; 查看hell…

第8章 泛型程序设计

文章目录 为什么要使用泛型程序设计类型参数的好处谁想成为泛型程序员 定义简单泛型类泛型方法类型变量的限定泛型代码和虚拟机类型擦除转换泛型表达式转换泛型方法类型擦除与多态会发生冲突桥方法实现多态桥方法与可协变的返回类型 调用遗留代码 限制与局限性泛型类型的继承规…

基于SpringBoot+Mybatis+Mysql+vue校园二手交易市场

基于SpringBootMybatisMysqlvue校园二手交易市场 一、系统介绍1、系统主要功能&#xff1a;2、环境配置 二、功能展示1.主页(客户)2.登陆、注册&#xff08;客户&#xff09;3.我的购物车(客户)4.我的商品详情(客户)5.我的商铺&#xff08;客户、商家&#xff09;6.我的信息&am…