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

Linux应用开发之网络套接字编程(实例篇)
服务端与客户端单连接 服务端代码 #include <sys/socket.h> #include <sys/types.h> #include <netinet/in.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #include <arpa/inet.h> #include <pthread.h> …...

业务系统对接大模型的基础方案:架构设计与关键步骤
业务系统对接大模型:架构设计与关键步骤 在当今数字化转型的浪潮中,大语言模型(LLM)已成为企业提升业务效率和创新能力的关键技术之一。将大模型集成到业务系统中,不仅可以优化用户体验,还能为业务决策提供…...

云启出海,智联未来|阿里云网络「企业出海」系列客户沙龙上海站圆满落地
借阿里云中企出海大会的东风,以**「云启出海,智联未来|打造安全可靠的出海云网络引擎」为主题的阿里云企业出海客户沙龙云网络&安全专场于5.28日下午在上海顺利举办,现场吸引了来自携程、小红书、米哈游、哔哩哔哩、波克城市、…...

【网络安全产品大调研系列】2. 体验漏洞扫描
前言 2023 年漏洞扫描服务市场规模预计为 3.06(十亿美元)。漏洞扫描服务市场行业预计将从 2024 年的 3.48(十亿美元)增长到 2032 年的 9.54(十亿美元)。预测期内漏洞扫描服务市场 CAGR(增长率&…...
服务器硬防的应用场景都有哪些?
服务器硬防是指一种通过硬件设备层面的安全措施来防御服务器系统受到网络攻击的方式,避免服务器受到各种恶意攻击和网络威胁,那么,服务器硬防通常都会应用在哪些场景当中呢? 硬防服务器中一般会配备入侵检测系统和预防系统&#x…...

Keil 中设置 STM32 Flash 和 RAM 地址详解
文章目录 Keil 中设置 STM32 Flash 和 RAM 地址详解一、Flash 和 RAM 配置界面(Target 选项卡)1. IROM1(用于配置 Flash)2. IRAM1(用于配置 RAM)二、链接器设置界面(Linker 选项卡)1. 勾选“Use Memory Layout from Target Dialog”2. 查看链接器参数(如果没有勾选上面…...

ETLCloud可能遇到的问题有哪些?常见坑位解析
数据集成平台ETLCloud,主要用于支持数据的抽取(Extract)、转换(Transform)和加载(Load)过程。提供了一个简洁直观的界面,以便用户可以在不同的数据源之间轻松地进行数据迁移和转换。…...

微服务商城-商品微服务
数据表 CREATE TABLE product (id bigint(20) UNSIGNED NOT NULL AUTO_INCREMENT COMMENT 商品id,cateid smallint(6) UNSIGNED NOT NULL DEFAULT 0 COMMENT 类别Id,name varchar(100) NOT NULL DEFAULT COMMENT 商品名称,subtitle varchar(200) NOT NULL DEFAULT COMMENT 商…...

JVM 内存结构 详解
内存结构 运行时数据区: Java虚拟机在运行Java程序过程中管理的内存区域。 程序计数器: 线程私有,程序控制流的指示器,分支、循环、跳转、异常处理、线程恢复等基础功能都依赖这个计数器完成。 每个线程都有一个程序计数…...
Spring AI Chat Memory 实战指南:Local 与 JDBC 存储集成
一个面向 Java 开发者的 Sring-Ai 示例工程项目,该项目是一个 Spring AI 快速入门的样例工程项目,旨在通过一些小的案例展示 Spring AI 框架的核心功能和使用方法。 项目采用模块化设计,每个模块都专注于特定的功能领域,便于学习和…...