【进阶篇-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-…...

TDengine 快速体验(Docker 镜像方式)
简介 TDengine 可以通过安装包、Docker 镜像 及云服务快速体验 TDengine 的功能,本节首先介绍如何通过 Docker 快速体验 TDengine,然后介绍如何在 Docker 环境下体验 TDengine 的写入和查询功能。如果你不熟悉 Docker,请使用 安装包的方式快…...

8k长序列建模,蛋白质语言模型Prot42仅利用目标蛋白序列即可生成高亲和力结合剂
蛋白质结合剂(如抗体、抑制肽)在疾病诊断、成像分析及靶向药物递送等关键场景中发挥着不可替代的作用。传统上,高特异性蛋白质结合剂的开发高度依赖噬菌体展示、定向进化等实验技术,但这类方法普遍面临资源消耗巨大、研发周期冗长…...

P3 QT项目----记事本(3.8)
3.8 记事本项目总结 项目源码 1.main.cpp #include "widget.h" #include <QApplication> int main(int argc, char *argv[]) {QApplication a(argc, argv);Widget w;w.show();return a.exec(); } 2.widget.cpp #include "widget.h" #include &q…...

Psychopy音频的使用
Psychopy音频的使用 本文主要解决以下问题: 指定音频引擎与设备;播放音频文件 本文所使用的环境: Python3.10 numpy2.2.6 psychopy2025.1.1 psychtoolbox3.0.19.14 一、音频配置 Psychopy文档链接为Sound - for audio playback — Psy…...

ElasticSearch搜索引擎之倒排索引及其底层算法
文章目录 一、搜索引擎1、什么是搜索引擎?2、搜索引擎的分类3、常用的搜索引擎4、搜索引擎的特点二、倒排索引1、简介2、为什么倒排索引不用B+树1.创建时间长,文件大。2.其次,树深,IO次数可怕。3.索引可能会失效。4.精准度差。三. 倒排索引四、算法1、Term Index的算法2、 …...
Java线上CPU飙高问题排查全指南
一、引言 在Java应用的线上运行环境中,CPU飙高是一个常见且棘手的性能问题。当系统出现CPU飙高时,通常会导致应用响应缓慢,甚至服务不可用,严重影响用户体验和业务运行。因此,掌握一套科学有效的CPU飙高问题排查方法&…...
C++.OpenGL (20/64)混合(Blending)
混合(Blending) 透明效果核心原理 #mermaid-svg-SWG0UzVfJms7Sm3e {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-SWG0UzVfJms7Sm3e .error-icon{fill:#552222;}#mermaid-svg-SWG0UzVfJms7Sm3e .error-text{fill…...

在 Spring Boot 中使用 JSP
jsp? 好多年没用了。重新整一下 还费了点时间,记录一下。 项目结构: pom: <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0" xmlns:xsi"http://ww…...
HTML前端开发:JavaScript 获取元素方法详解
作为前端开发者,高效获取 DOM 元素是必备技能。以下是 JS 中核心的获取元素方法,分为两大系列: 一、getElementBy... 系列 传统方法,直接通过 DOM 接口访问,返回动态集合(元素变化会实时更新)。…...

C++实现分布式网络通信框架RPC(2)——rpc发布端
有了上篇文章的项目的基本知识的了解,现在我们就开始构建项目。 目录 一、构建工程目录 二、本地服务发布成RPC服务 2.1理解RPC发布 2.2实现 三、Mprpc框架的基础类设计 3.1框架的初始化类 MprpcApplication 代码实现 3.2读取配置文件类 MprpcConfig 代码实现…...