【进阶篇-Day14:JAVA中IO流之转换流、序列化流、打印流、Properties集合的介绍】
目录
- 1、转换流
- 1.1 转换流分类:
- 1.2 转换流的作用
- (1)按照指定的字符编码读写操作:
- (2)将字节流转换为字符流进行操作:
- 2、序列化流
- 2.1 序列化的基本使用:
- 2.2 序列化的操作流程:
- 2.3 总结
- 2.4 案例:
- 3、打印流
- 3.1 打印流概念
- 3.2 打印流的使用
- (1)PrintStream打印流:
- (2)PrintWriter打印流:
- (3)总结:
- 4、Properties集合
- 4.1 Properties介绍
- 4.2 作为集合的使用:
- 4.3 和IO有关的方法:
- 4.4 总结
1、转换流
1.1 转换流分类:

1.2 转换流的作用
(1)按照指定的字符编码读写操作:

(2)将字节流转换为字符流进行操作:

package com.itheima.change;
import java.io.*;
public class ChangeStreamDemo1 {/*** 转换流按照指定的字符编码读写** 构造方法:* InputStreamReader(InputStream in, String CharsetName)* OutputStreamWriter(OutputStream out, String CharsetName)*/public static void main(String[] args) throws IOException {//read();write();}private static void write() throws IOException {//按照gbk编码方式写入内容,同时是追加写入OutputStreamWriter osw = new OutputStreamWriter(new FileOutputStream("D:\\c.txt", true), "gbk");osw.write("哈哈");osw.close();}private static void read() throws IOException {//按照gbk编码方式读取内容InputStreamReader isr = new InputStreamReader(new FileInputStream("D:\\stu.txt"), "gbk");int i;while ((i = isr.read()) != -1){System.out.println((char)i);}isr.close();}
}

2、序列化流
2.1 序列化的基本使用:

package com.itheima.serialization;
import java.io.*;
public class SerializationDemo1 {/*** 序列化流读写对象* 序列化: 将对象写出到文件* public ObjectOutputStream(OutputStream out)* 反序列化:从文件中将对象读取到程序* public ObjectInputStream(InputStream in)*/public static void main(String[] args) throws IOException, ClassNotFoundException {//writeObject();readObject();}private static void readObject() throws IOException, ClassNotFoundException {//反序列化,即从文件中将对象读取到程序ObjectInputStream ois = new ObjectInputStream(new FileInputStream("stu.txt"));Object o = ois.readObject();System.out.println(o);//关闭流ois.close();}private static void writeObject() throws IOException {//创建一个对象Student s = new Student("张三", 23);//将对象序列化,即写入到文件中ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("stu.txt"));oos.writeObject(s);//调用这个方式之前,序列化的对象需要实现Serializable接口//关闭流oos.close();}
}
2.2 序列化的操作流程:

上述流程解释如下:
1、当我们要序列化对象时,首先需要对象实现Serializable接口,实现了这个接口之后,其实就会给这个对象生成一个序列化ID;
2、然后调用writeObject()方法进行序列化时,除了将对象的内容保存到文件之外,还会将这个序列化ID写入;
3、当我们调用readObject()方法进行反序列化时,会对比文件里的序列ID是否与当前程序中的对象序列化ID相等,如果相等则反序列化成功,如果不相等,则报错。
那有人就要问了,怎么会不相等呢?试想一下,如果序列化后,我们将对象增加属性或方法,那么序列化ID肯定就不相等了。
如何解决这个问题呢?
答:当我们标记一个对象需要序列化时(实现Serializable接口就是这个标记),手动指定序列化ID,那么就能解决上述问题,如下这样即可:


手动指定的序列化ID,我们可以借助idea工具实现,设置如下:

然后在idea中,提示快捷键alt+enter即可,或者点击提示也行。具体可以参考:使用idea自动生成序列化ID全过程
如果某一个属性不想被序列化,则需要使用
transient关键字修饰,如下所示:

2.3 总结

2.4 案例:

package com.itheima.serialization;
import java.io.*;public class SerializationDemo2 {public static void main(String[] args) throws IOException, ClassNotFoundException {//1、定义三个对象Student s1 = new Student("张三", 23);Student s2 = new Student("李四", 24);Student s3 = new Student("王五", 25);//2、定义输出序列化流,并执行序列化ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("序列化.txt", true));oos.writeObject(s1);oos.writeObject(s2);oos.writeObject(s3);oos.close();//3、定义反序列化流,并执行反序列化ObjectInputStream ois = new ObjectInputStream(new FileInputStream("序列化.txt"));while (true){try {//readObject()方法读取到末尾后,如果继续读取,则会报IOException异常Object o = ois.readObject();System.out.println(o);}catch (IOException e){break;}}ois.close();}
}
上述代码的写法,多个对象就做多少次序列化,同理,那要反序列化也需要多次。其实一般情况下,我们可以将对象存入一个集合中,然后只执行一次序列化,一次反序列化即可,如下代码:
package com.itheima.serialization;
import java.io.*;
import java.util.ArrayList;
import java.util.List;public class SerializationDemo3 {public static void main(String[] args) throws IOException, ClassNotFoundException {//1、定义三个对象List<Student> list = new ArrayList<>();list.add(new Student("张三", 23));list.add(new Student("李四", 24));list.add(new Student("王五", 25));//2、定义输出序列化流,并执行序列化ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("序列化2.txt", true));oos.writeObject(list);//只执行一次序列化,因为List也实现了Serializable接口oos.close();//3、定义反序列化流,并执行反序列化ObjectInputStream ois = new ObjectInputStream(new FileInputStream("序列化2.txt"));List<Student> list1 = (List<Student>)ois.readObject();//只执行一次ois.close();//4、遍历打印for (Student student : list1) {System.out.println(student);}}
}
3、打印流
3.1 打印流概念


package com.itheima.print;
import java.io.PrintStream;public class PrintDemo1 {/*** System.out.println() 打印语句的细节*/public static void main(String[] args) {//1、获取打印流PrintStream out = System.out;//2、执行打印out.println("你好");//简化如下System.out.println("你好");}
}
3.2 打印流的使用
(1)PrintStream打印流:
标准打印流是向控制台输出,那么能不能往文件写入呢?为了解决这个问题,我们接着看,下面是打印流的三个构造方法,看例子怎么使用:
package com.itheima.print;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.PrintStream;public class PrintDemo2 {/*** PrintStream基本使用* 1、创建对象关联文件* public PrintStream(OutputStream os)* public PrintStream(File f)* public PrintStream(File f, String csn):第二个参数为指定的编码格式* public PrintStream(String filepath)* public PrintStream(String filepath, String csn):第二个参数为指定的编码格式* 2、写出方法* write(): 写出也给字节,不建议使用,无法原样写入* print(): 原样写入数据,无换行* println(): 原样写入数据,带有换行*/public static void main(String[] args) throws Exception {//method1();//method2();method3();}/*** 不带编码格式的打印流*/private static void method1() throws Exception {//1、定义打印流PrintStream ps = new PrintStream("打印流.txt");//2、写入文件ps.write(97);//不能保证原样写入,不建议使用ps.println(97);//原样写入数据,带有换行ps.print(97);//原样写入数据,无换行ps.close();}/*** 指定编码格式的打印流*/private static void method2() throws Exception {PrintStream ps = new PrintStream("打印流.txt", "utf-8");ps.println("你好啊");}/*** 追加写入*/private static void method3() throws FileNotFoundException {PrintStream ps = new PrintStream(new FileOutputStream("打印流.txt", true));ps.println("追加写入了一行");ps.println("追加写入了二行");ps.println("追加写入了三行");}
}
(2)PrintWriter打印流:

package com.itheima.print;
import java.io.FileNotFoundException;
import java.io.FileWriter;
import java.io.IOException;
import java.io.PrintWriter;public class PrintWriteDemo1 {/*** PrintWrite的使用*/public static void main(String[] args) throws IOException {//1、基本使用PrintWriter pw = new PrintWriter("F.txt");pw.println("你好");pw.flush();pw.close();//2、自动刷新的使用方法:在构造方法里第二个参数写true,不调用flush或close方法,也会自动刷新// 注:只对println方法管用PrintWriter pw2 = new PrintWriter(new FileWriter("G.txt"), true);pw2.println("哈哈哈");}
}
(3)总结:

4、Properties集合
4.1 Properties介绍


4.2 作为集合的使用:

package com.itheima.properties;
import java.util.Properties;
import java.util.Set;public class PropertiesDemo1 {/*** Properties作为集合的使用:* Object setProperty(String key, String value):类似Map集合的put方法* String getProperty(String key):类似Map集合的get方法* Set<String> stringPropertyNames():类似Map集合的keySet方法*/public static void main(String[] args) {Properties p = new Properties();//1、set方法p.setProperty("username", "admin");p.setProperty("password", "1234");System.out.println(p);//{password=1234, username=admin}//2、get方法Object username = p.get("username");Object password = p.get("password");System.out.println(username);//adminSystem.out.println(password);//1234//3、keySet方法:用于获取key组成的集合Set<String> keySet = p.stringPropertyNames();for (String s : keySet) {System.out.println(s + "------" + p.get(s));}}
}
4.3 和IO有关的方法:

package com.itheima.properties;
import java.io.*;
import java.util.Properties;
public class PropertiesDemo2 {/*** Properties 和 IO 有关的方法* void load(InputStream inStream) 从输入字节流读取属性列表(键和元素对)* void load(Reader reader) 从输入字符流读取属性列表(键和元素对)* void store(OutputStream outStream, String comments) 将集合的键值对写出到文件(字节流),comments是注释* void store(Writer writer, String comments) 将集合的键值对写出到文件(字符流),comments是注释*/public static void main(String[] args) throws IOException {
// storeMethod();Properties prop = new Properties();//load()方法:从文件将内容读取到流中
// FileInputStream fis = new FileInputStream("config.properties");//字节流FileReader fis = new FileReader("config.properties");//字符流prop.load(fis);fis.close();System.out.println(prop);//{password=1234, username=admin}}private static void storeMethod() throws IOException {Properties prop = new Properties();prop.setProperty("username", "admin");prop.setProperty("password", "1234");//store()方法:将内容写入文件
// FileOutputStream fos = new FileOutputStream("config.properties");//字节流FileWriter fos = new FileWriter("config.properties");//字符流prop.store(fos, "我是注释,不想写的话可以写null");fos.close();}
}
4.4 总结

相关文章:
【进阶篇-Day14:JAVA中IO流之转换流、序列化流、打印流、Properties集合的介绍】
目录 1、转换流1.1 转换流分类:1.2 转换流的作用(1)按照指定的字符编码读写操作:(2)将字节流转换为字符流进行操作: 2、序列化流2.1 序列化的基本使用:2.2 序列化的操作流程…...
【Material-UI】Checkbox 组件中的 Label Placement 设置详解
文章目录 一、Checkbox 组件简介1. 组件概述2. labelPlacement 属性 二、labelPlacement 属性的使用方法三、各标签位置的效果与应用场景1. Top(顶部)2. Start(左侧)3. Bottom(底部)4. End(右侧…...
XJTUSE-离散数学-集合
基本概念 集合的包含与相等,如子集幂集:以A的所有子集组成的集合称为A的幂集AB <> 集合的基本运算 基本运算证明会考 交运算并运算补运算差运算:A \ B 环和运算:环积运算: 集合的其他表示方法 文图表示法 …...
安徽省消防设施操作员题库
1.()是做人的基本准则,也是社会道德和职业道德的一项基本规范。 A.诚实守信(正确答案) B.爱岗敬业 C.以人为本 D.钻研业务 2.()是指为了追求完美,坚持工匠精神,在工作中不放松对自己的要求。 A.爱岗敬业 B.精益求精(正确答案) C.勤奋刻苦 D.专…...
Singularity容器安装与使用
Singularity容器技术 docker的缺点: 资源限制问题:Slurm利用cgroups实现资源分配,Docker通过ocker daemon无法实现。 权限问题:Docker daemon使用 root用户启动,HPC场录期望使用普通用户运行容器。 singuiarily主要是适合HPC中的普通用户,…...
Linux 文件、重定向、缓冲区
个人主页:仍有未知等待探索-CSDN博客 专题分栏: Linux 目录 一、文件 1、文件的理解(浅层) 1.文件是什么? 2.文件操作的前提 3.文件的存储 4.一个进程可以打开多个文件吗?如果可以怎么管理的…...
WEB漏洞-SQL注入之MYSQL注入
跨库注入的原理:针对同一IP下的不同域名 同一服务器下 网站A对应数据库A 网站B对应数据库B 网站C对应数据库C 如果某网站的存在注入点,注入点的权限恰好是root权限,也就是最高权限,那么可以通过跨库注入获取其他网站的数据库…...
mysql 查询 from a, b 和 a left join b 有什么区别
在MySQL中,from a, b 和 a left join b 有显著的区别,主要体现在查询结果和使用场景上。 基本语法与返回结果: from a, b:这种写法实际上是将两个表作为一个整体来处理,即假设这两个表是同一个表。因此,它…...
禁用ssh 22端口
在Linux系统中,要关闭SSH端口,可以通过修改SSH配置文件或防火墙规则来实现。 方法一:修改SSH配置文件 1. 使用root用户登录Linux系统。 2. 打开SSH配置文件,可以使用任何文本编辑器,如vi或nano。在大多数Linux发行版上…...
C++基础编程的学习3
nullptr关键字 在C11之前,空指针通常用NULL或0表示。然而,这些表示方法存在类型安全问题。C11引入了nullptr关键字,它提供了一个明确的、类型安全的空指针值。 Lambda表达式 Lambda表达式是C11引入的一种便捷的匿名函数定义方式。当Lambda…...
Java中的Optional类:解锁优雅编程的秘密
引言 在Java开发的世界里,空指针异常(NullPointerException)一直是让无数程序员头疼的问题之一。它不仅打断了程序的正常执行流程,还可能隐藏在复杂的业务逻辑之中,难以定位。自Java 8起,一个新的类——Op…...
聆思CSK6大模型开发板语音控制风扇(上)
前言 本文介绍如何实现大模型语音交互对风扇实现开关控制,示例使用的硬件是聆思CSK6大模型开发板,大模型接的是星火大模型。本文将先详细介绍大模型云端从获取交互语音到下发控制指令的全过程,包括整合上下文、配置提示词、语义意图分类、提取…...
代码随想录算法训练营第四十一天 | 121. 买卖股票的最佳时机、122. 买卖股票的最佳时机II、123. 买卖股票的最佳时机III
一、121. 买卖股票的最佳时机 题目链接:121. 买卖股票的最佳时机 - 力扣(LeetCode) 文章讲解:代码随想录 (programmercarl.com)——121. 买卖股票的最佳时机 视频讲解:动态规划之 LeetCode:121.买卖股票的最…...
延时队列与redis and rabbitmq
延时队列是什么 延时队列(Delay Queue)是一种特殊的消息队列,它允许你在添加消息时设置一个延时时间,消息只有在延时时间到达后才能被消费。这种机制在分布式系统中非常有用,常用于处理需要在指定时间后执行的任务&am…...
数据结构--单链
#include "link.h" plink get_head() { plink pmalloc(sizeof(Link)); if(pNULL) { printf("申情节点失败\n"); return NULL; } p->len0; p->nextNULL; return p; } void head_insert(plink L,int a) {…...
春秋云镜CVE-2023-38836
打开靶场环境 点击发现一个登陆框,弱口令试一下 发现账号密码为admin,password 随便点击点击 Media发现这里可以上传文件上传木马试试 <?php eval($_POST["wjq"]); ?> 发现不能上传php文件 php内容 修改他的格式 抓包绕过一下 302就可以其实已经…...
Linux 进程概念
Linux 进程概念 硬件理解冯 诺依曼体系结构五大组成部件强调存储 引子操作系统(Operator System)概念作用认识为什么要有操作系统? 结构 示意图理解操作系统system call库函数概念 进程什么是进程概念误区认识 描述进程 - PCBtask_struct - P…...
【秋招突围】2024届校招-米哈游笔试题-第二套
🍭 大家好这里是 春秋招笔试突围,一起备战大厂笔试 💻 ACM金牌团队🏅️ | 多次AK大厂笔试 | 编程一对一辅导 ✨ 本系列打算持续跟新 春秋招笔试题 👏 感谢大家的订阅➕ 和 喜欢💗 和 手里的小花花🌸 ✨ 笔试合集传送们 -> 🧷春秋招笔试合集 🌰 明晚又有米…...
tklog v0.0.9 :Rust灵活高效日志管理
tklog是rust高性能结构化日志库,支持同步日志,异步日志,支持自定义日志的输出格式,支持按时间,按文件大小分割日志文件,支持日志文件压缩备份,支持官方日志库标准API,支持mod独立参数…...
长安链java-sdk打成jar包部署找不到配置文件,springBoot项目制作Docker镜像
长安链使用sdk_config.yml的形式来引入用户的各种证书文件, 但是打成jar包部署在服务器上会提示找不到文件。 由于国内对镜像的限制,我选用了阿里的龙蜥镜像,里面提供java1.8的环境,因为长安链要1.8的环境 docker pull anolis-…...
使用docker在3台服务器上搭建基于redis 6.x的一主两从三台均是哨兵模式
一、环境及版本说明 如果服务器已经安装了docker,则忽略此步骤,如果没有安装,则可以按照一下方式安装: 1. 在线安装(有互联网环境): 请看我这篇文章 传送阵>> 点我查看 2. 离线安装(内网环境):请看我这篇文章 传送阵>> 点我查看 说明:假设每台服务器已…...
Docker 离线安装指南
参考文章 1、确认操作系统类型及内核版本 Docker依赖于Linux内核的一些特性,不同版本的Docker对内核版本有不同要求。例如,Docker 17.06及之后的版本通常需要Linux内核3.10及以上版本,Docker17.09及更高版本对应Linux内核4.9.x及更高版本。…...
Java 语言特性(面试系列2)
一、SQL 基础 1. 复杂查询 (1)连接查询(JOIN) 内连接(INNER JOIN):返回两表匹配的记录。 SELECT e.name, d.dept_name FROM employees e INNER JOIN departments d ON e.dept_id d.dept_id; 左…...
MySQL 隔离级别:脏读、幻读及不可重复读的原理与示例
一、MySQL 隔离级别 MySQL 提供了四种隔离级别,用于控制事务之间的并发访问以及数据的可见性,不同隔离级别对脏读、幻读、不可重复读这几种并发数据问题有着不同的处理方式,具体如下: 隔离级别脏读不可重复读幻读性能特点及锁机制读未提交(READ UNCOMMITTED)允许出现允许…...
什么是库存周转?如何用进销存系统提高库存周转率?
你可能听说过这样一句话: “利润不是赚出来的,是管出来的。” 尤其是在制造业、批发零售、电商这类“货堆成山”的行业,很多企业看着销售不错,账上却没钱、利润也不见了,一翻库存才发现: 一堆卖不动的旧货…...
vue3 定时器-定义全局方法 vue+ts
1.创建ts文件 路径:src/utils/timer.ts 完整代码: import { onUnmounted } from vuetype TimerCallback (...args: any[]) > voidexport function useGlobalTimer() {const timers: Map<number, NodeJS.Timeout> new Map()// 创建定时器con…...
JUC笔记(上)-复习 涉及死锁 volatile synchronized CAS 原子操作
一、上下文切换 即使单核CPU也可以进行多线程执行代码,CPU会给每个线程分配CPU时间片来实现这个机制。时间片非常短,所以CPU会不断地切换线程执行,从而让我们感觉多个线程是同时执行的。时间片一般是十几毫秒(ms)。通过时间片分配算法执行。…...
Java编程之桥接模式
定义 桥接模式(Bridge Pattern)属于结构型设计模式,它的核心意图是将抽象部分与实现部分分离,使它们可以独立地变化。这种模式通过组合关系来替代继承关系,从而降低了抽象和实现这两个可变维度之间的耦合度。 用例子…...
CRMEB 中 PHP 短信扩展开发:涵盖一号通、阿里云、腾讯云、创蓝
目前已有一号通短信、阿里云短信、腾讯云短信扩展 扩展入口文件 文件目录 crmeb\services\sms\Sms.php 默认驱动类型为:一号通 namespace crmeb\services\sms;use crmeb\basic\BaseManager; use crmeb\services\AccessTokenServeService; use crmeb\services\sms\…...
Kafka主题运维全指南:从基础配置到故障处理
#作者:张桐瑞 文章目录 主题日常管理1. 修改主题分区。2. 修改主题级别参数。3. 变更副本数。4. 修改主题限速。5.主题分区迁移。6. 常见主题错误处理常见错误1:主题删除失败。常见错误2:__consumer_offsets占用太多的磁盘。 主题日常管理 …...

