当前位置: 首页 > news >正文

Java进阶11 IO流、功能流

Java进阶11 IO流-功能流

一、字符缓冲流

字符缓冲流在源代码中内置了字符数组,可以提高读写效率

1、构造方法

方法说明
BufferedReader(new FileReader(文件路径))对传入的字符输入流进行包装
BufferedWriter(new FileWriter(文件路径))对传入的字符输出流进行包装

注意:缓冲流不具备读写功能,它们只是对普通的流对象进行包装,正真和文件建立关联的,还是普通流对象

1.1 字符缓冲流的使用
public class BufferedStreamDemo1 {/*1、字符缓冲流的基本使用*/public static void main(String[] args) throws IOException {BufferedReader br = new BufferedReader(new FileReader("day10\\A.txt"));
​//单个读取int i;while((i=br.read())!=-1){System.out.println((char)i);}
​//读取字符数组的一部分int len;char[] chs = new char[1024];while((len=br.read())!=-1){String s = new String(chs,0,len);System.out.println(s);}
​br.close();
​//字符缓冲输出流BufferedWriter bw = new BufferedWriter(new FileWriter("day10\\A.txt"));bw.write("写入数据......")bw.close();}
}
1.2 拷贝文件Demo
public class BufferedStreamDemo {/*字符缓冲流+自定义数组  拷贝文件*/public static void main(String[] args) throws IOException {//字符流只能拷贝纯文本文件BufferedReader br = new BufferedReader(new FileReader("day11\\FileReaderDemo1.java"));BufferedWriter bw = new BufferedWriter(new FileWriter("day11\\copy.java"));
​int len;char[] chs = new char[1024];while((len=br.read())!=-1){bw.write(chs,0,len);}br.close();bw.close();}
}

2、成员方法(特有)

2.1 BufferedReader
方法说明
public String readLine()一次性读取整行字符串,读取到末尾返回null
2.2 BufferedWriter
方法说明
public void newLine()写出换行符(具有兼容性)兼容各个操作系统的换行符
2.3 特有方法使用Demo
public class BufferedStreamDemo2 {/*拷贝本项目中A.txt文件到本项目copy.txt;一整行一整行地拷贝*/public static void main(String[] args) throws IOException {BufferedReader br = new BufferedReader(new FileReader("day11\\A.txt"));BufferedWriter bw = new BufferedWriter(new FileWriter("day11\\copy.txt"));
​String line;while((line=br.readLine())!=null){//readLine读不到换行符bw.write(line);//写出换行符bw.newLine();}br.close();bw.close();}
}

二、转换流

1、按照指定的字符编码读写操作

构造方法说明
InputStreamReader(InputStream in,String charsetName)按照指定的字符编码读取
OutputStreamWriter(OutputStream out,String charsetName)按照指定的字符编码写出
public class ChangeStreamDemo {/*转换流的使用Demo*/public static void main(String[] args) throws IOException {//使用GBK字符编码向路径D:\itheima\Resource\A.txt文件写入你好呀OutputStreamWriter osw = new OutputStreamWriter(new FileOutputStream("D:\\itheima\\Rescouce\\A.txt"),"GBK");osw.write("你好呀");osw.close();
​//使用gbk字符编码从路径D:\itheima\Resource\A.txt文件中读取字符InputStreamReader isr = new InputStreamReader(new FileInputStream("D:\\itheima\\Resource\\A.txt"),"gbk");//单个读取int i;while((i=isr.read())!=-1){System.out.print((char)i);}isr.close();}
}

2、将字节流转换为字符流进行操作

  • 应用场景

三、序列化流

可以在流中,以字节的形式直接读写对象

1、构造方法

方法说明
public ObjectInuputStream(InputStream in)对象输入流关联文件,关联方式使用字节输入流
public ObjectOutputStream(OutoutStream out)对象输出流关联文件,关联方式使用字节输出流

2、成员方法

方法说明
Object readObject()从流中读取对象(反序列化)
void writeObject(Object obj)在流中将对象写出(序列化)

3、方法使用案例

需求:现有3个学生对象,并将对象序列化到流中,随后完成反序列化操作

public class ObjectStreamDemo2 {public static void main(String[] args) throws IOException, ClassNotFoundException {readObject();
​//用流读对象ObjectInputStream ois = new ObjectInputStream(new FileInputStream("day11\\obj.txt"));ArrayList<Student> stuList  = (ArrayList<Student>) ois.readObject();System.out.println(stuList);ois.close();}
​//将对象写入流private static void readObject() throws IOException {//为了一次读写三个学生对象,创建list集合存储ArrayList<Student> stu = new ArrayList<>();stu.add(new Student("张三",23));stu.add(new Student("李四",24));stu.add(new Student("王五",25));
​ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("day11\\obj.txt"));oos.writeObject(stu);oos.close();}
}

注意事项

  • 类需要实现Serializable接口才可以序列化

  • 实现接口后,类就会自带一份序列版本号。序列化操作的时候,会将对象信息和版本号一并保存到文件,反序列化的时候,会拿着版本号和流中的版本号进行对比,不一致就会抛异常,起到提醒作用。为了避免这个问题,推荐手动写死serialVersionUID

    在IDEA中设置快捷添加serialVersionUID的快捷键

  • 如果类中的属性被transient进行修饰,将不会参与序列化操作

  • 建议:对象的读写操作只进行一次

四、打印流

打印流可以实现方便、高效的打印数据到文件中去(打印什么数据就是什么数据)

1、PrintStream字节打印流(重点)

构造器说明
public PrintStream(OutputStream os)打印流直接通向字节输出流管道(想要追加时可在os对象的第二个参数位置打开append追加开关)
public PrintStream(File f)打印流直接通向文件对象
public PrintStream(String filepath)打印流直接通向文件路径
成员方法说明
public void print\println(Xxx xxx)打印任意类型的数据出去

2、PrintWriter字符打印流(了解即可)

构造器说明
public PrintWriter(OutputStream os)打印流直接通向字节输出流管道
public PrintWriter(Writer w)打印流直接通向字符输出流管道
public PrintWriter(File f)打印流直接通向文件对象
public PrintWriter(String filepath)打印流直接通向文件路径
方法说明
public void print\println(Xxx xxx)打印任意类型的数据出去

五、Properties集合

1、Properties作为集合使用

构造器说明
Properties()创建一个没有默认值的空属性列表
方法说明
Object setProperty(String key,String value)添加(修改)一个键值对
String getPreperty(String key,String defaultValue)根据键获取值
Set<String> stringPropertyNames()获取集合中所有的键
public class PropertiesDemo1 {/*properties作为集合的使用*/public static void main(String[] args) {//1、创建集合容器(不需要指定泛型,键和值都是String类)Properties prop = new Properties();//2、添加数据到集合(类似于put方法,当key相同时,新value会覆盖旧value)prop.setProperty("username","admin");prop.setProperty("passward","123456");
​//3、获取集合数据,根据键找值String username = prop.getProperty("username");String passward = prop.getProperty("passward");System.out.println(username+"----"+passward);
​System.out.println("-------------------------------");
​//4、类似Map集合中keySet方法,获取所有的键Set<String> keySet = prop.stringPropertyNames();//5、遍历集合+根据键找值拿到properties集合中的所有键值对for (String key : keySet) {System.out.println(key+"----"+prop.get(key));}}
}

2、Properties和IO有关的方法

方法说明
void load(InputStream inStream)从输入字节流读取属性列表(键和元素对)
void load(Reader reader)从输入字符流读取属性列表(键和元素对)
void store(OutputStream out,String comments)将此属性列表(键和元素对)写入此Properties表中,以适合于使用load(InputStream)方法的格式写入输出字符流
void store(Writer writer,String comments)将次属性列表(键和元素对)写入此Properties表中,以适合使用load(Reader)方法的格式写入输出字符流
public class PropertiesDemo2 {/*以字节输入输出流为例*/public static void main(String[] args) throws IOException {store();load();}
​//读取方法private static void load() throws IOException {Properties prop = new Properties();FileInputStream fis = new FileInputStream("day11\\config.properties");//将读取到的内容存入prop集合prop.load(fis);System.out.println(prop);fis.close();
​/**经常需要修改的值(如用户名密码、数据库连接密码等)写在配置文件里,到时候只要执行这个代码就能直接加载配置文件里的一些设置,免去了频繁修改代码的繁琐*/String username = prop.getProperty("username");String password = prop.getProperty("password");
​System.out.println(username);System.out.println(password);}
​//写入方法private static void store() throws IOException {Properties prop = new Properties();prop.setProperty("username","admin");prop.setProperty("password","123456");
​FileOutputStream fos = new FileOutputStream("day11\\cpnfig.properties");
​//第二个参数为备注内容,可传null,也可以传入字符串值prop.store(fos,"null");
​fos.close();}
}

相关文章:

Java进阶11 IO流、功能流

Java进阶11 IO流-功能流 一、字符缓冲流 字符缓冲流在源代码中内置了字符数组&#xff0c;可以提高读写效率 1、构造方法 方法说明BufferedReader(new FileReader(文件路径))对传入的字符输入流进行包装BufferedWriter(new FileWriter(文件路径))对传入的字符输出流进行包装…...

windows 安装 Conda

1 Conda简介 Conda 是一个开源的软件包管理系统和环境管理系统,用于安装多个版本的软件包及其依赖关系,并在它们之间轻松切换。Conda 是为 Python 程序创建的,适用于 Linux,OS X 和Windows,也可以打包和分发其他软件。一般用conda来维护多个python版本。 2 安装…...

IPsec VPN简介

什么是IPsec&#xff1f; IPsec&#xff08;Internet Protocol Security&#xff09;是为IP网络提供安全性的协议和服务的集合&#xff0c;它是VPN&#xff08;Virtual Private Network&#xff0c;虚拟专用网&#xff09;中常用的一种技术。其实就是一种协议簇&#xff08;类…...

探索 Canva 的功能以及如何有效使用 Canva

『创意瞬间变现&#xff01;Canva AI Drawing 让你的文字描绘成艺术』 在数字设计和创意领域&#xff0c;Canva 是创新和用户友好性的灯塔。这个平台不仅简化了图形设计&#xff0c;还引入了 AI Drawing 等强大工具&#xff0c;使其成为专业人士和初学者的首选解决方案。让我们…...

python中匿名函数简单样例

目录 一、匿名函数&#xff08;也称为 lambda 函数&#xff09;&#xff1a; 二、简单样例&#xff1a; 2.1 filter() 函数: 2.2 map() 函数: 2.3 sorted() 函数: 一、匿名函数&#xff08;也称为 lambda 函数&#xff09;&#xff1a; 简洁性&#xff1a;匿名函数通常比命…...

【SpringBoot】 什么是springboot(二)?springboot操作mybatisPlus、swagger、thymeleaf模板

文章目录 SpringBoot第三章1、整合mybatsPlus1-234-67-10问题 2、整合pageHelper分页3、MP代码生成器1、编写yml文件2、导入依赖3、创建mp代码生成器4、生成代码5、编写配置类扫描mapper类6、编写控制器类 4、swagger1、什么是swagger2、作用3、发展历程4、一个简单的swagger项…...

【JavaWeb】前后端分离SpringBoot项目快速排错指南

1 发起业务请求 打开浏览器开发者工具&#xff0c;同时显示网络&#xff08;Internet&#xff09;和控制台&#xff08;console&#xff09; 接着&#xff0c;清空控制台和网络的内容&#xff0c;如下图 然后&#xff0c;点击你的业务按钮&#xff0c;发起请求。 首先看控制台…...

Go语言高级特性

目录 1. 并发编程 1.1 Goroutine轻量级线程 1.2 Channel通信机制 1.3 WaitGroup等待组 1.4 Mutex互斥锁 2. 垃圾回收机制 2.1 内存管理介绍 2.2 垃圾回收原理 2.3 性能调优策略 2.4 常见问题及解决方案 3. 接口与反射 3.1 接口定义与实现 3.2 空接口与类型断言 3…...

边缘计算安全有多重要

德迅云安全研究发现边缘安全是对存储或处理在网络边缘的数据的保护。边缘可以用不同的方式定义&#xff0c;但一般来说&#xff0c;它包括企业直接控制之外的任何设备或位置。这可能包括传感器、连接物联网的设备和移动设备。 边缘计算正在彻底改变商业运作方式。这引发了对边缘…...

Uniapp开发入门:构建跨平台应用的全面指南

引言 什么是Uniapp Uniapp是一款由DCloud公司推出的基于Vue.js的跨平台应用开发框架。它的核心理念是“一套代码&#xff0c;多端运行”&#xff0c;开发者只需编写一份代码&#xff0c;即可生成包括iOS、Android、H5、微信小程序、支付宝小程序、百度小程序等多平台的应用。…...

初级银行从业资格证知识点(十)

中国银保监会近年来启动了银行业保险业清廉金融文化建设活动&#xff0c;旨在通过全覆盖参与、全过程融入、全方位提升&#xff0c;增强金融从业人员清廉从业意识&#xff0c;培育清廉金融理念&#xff0c;通过文化的渗透力和影响力&#xff0c;厚植清廉根基&#xff0c;提升金…...

设计模式-13 - Prototype Design Pattern 原型设计模式

设计模式-13 - Prototype Design Pattern 原型设计模式 1.定义 原型设计模式是一种创建对象的方式&#xff0c;它通过复制一个现有的对象&#xff08;原型&#xff09;来创建一个新对象。 2.内涵 优点&#xff1a; 创建对象的高效方式&#xff1a;克隆一个对象比从头开始创建…...

05. 【Java教程】第一个 Java 程序

本节我们将以Windows操作系统为例&#xff0c;编写并执行第一个Java程序。在这之前&#xff0c;请确保你的操作系统上已经安装了JDK 1. 编译程序 大家可能有个疑问&#xff0c;为什么需要编译程序呢&#xff1f;计算机不能直接执行我们编写的源代码吗&#xff1f; 这是由于计…...

网易灵犀办公企业邮箱的IMAP和POP3服务器地址

IMAP 电子邮件地址&#xff1a;saleyouxiang.com 帐户类型&#xff1a;IMAP 接收邮件服务器&#xff1a;imaphz.qiye.163.com 发送邮件服务器&#xff1a;smtphz.qiye.163.com 用户名&#xff1a;saleyouxiang.comPOP3 电子邮件地址&#xff1a;saleyouxiang.com 帐户类型&…...

吴恩达深度学习笔记:优化算法 (Optimization algorithms)2.3-2.5

目录 第二门课: 改善深层神经网络&#xff1a;超参数调试、正 则 化 以 及 优 化 (Improving Deep Neural Networks:Hyperparameter tuning, Regularization and Optimization)第二周&#xff1a;优化算法 (Optimization algorithms)2.3 指数加权平均数&#xff08;Exponential…...

【正版系统】海外短剧系统功能介绍,前端uniapp+开源。

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言 一、海外短剧系统功能介绍 二、搭建要求 1.系统要求 总结 前言 短剧作为一种快速、紧凑的娱乐形式&#xff0c;正逐渐受到更多海外观众的喜爱。这种需求增长为…...

位图(c++)

文章目录 1.位图概念2.位图的实现3.应用&#xff08;解决整形存在或次数问题&#xff09;3.1存在问题3.2次数问题 5.搜索的方法对比&#xff1a; 1.位图概念 和哈希一样&#xff0c;都是一个表来记录某个元素的个数或者存在与否&#xff1b;不同的是哈希使用的计算机定义的完整…...

音源分离 | Hybrid Spectrogram and Waveform Source Separation

一、摘要 本文提出了基于Demucs架构的的时域频域的分离模型。提出的模型在2021年索尼组织的音乐分离挑战中获胜。该架构还包括其他改进&#xff0c;如压缩残差分支、局部注意力或奇异值正则化。 在MusDB HQ数据集上&#xff0c;所有源的信噪比&#xff08;SDR&#xff09;平均提…...

动态el-form表单以及动态禁用

当右侧下拉框选中为 长期有效,那么左侧输入框为禁用状态; <el-form-item label"证明有效期" class"is-required"><div v-for"(item,index) in form.arrayDat" :key"index" style"width: 100%;display: flex;justify-co…...

【Web后端】web后端开发简介_Servlet简介

1.web后端开发简介 Java企业级开发&#xff0c;也就是学习]avaEE(Enterprise Edition)版本,是一种结构和一套标准。在应用中开发的标准就是Servlet、jsp和JavaBean技术。jsp技术现在已基本处于淘汰状态&#xff0c;简单了解即可web后端开发&#xff0c;基于B/S模式的开发体系。…...

解决Ubuntu22.04 VMware失败的问题 ubuntu入门之二十八

现象1 打开VMware失败 Ubuntu升级之后打开VMware上报需要安装vmmon和vmnet&#xff0c;点击确认后如下提示 最终上报fail 解决方法 内核升级导致&#xff0c;需要在新内核下重新下载编译安装 查看版本 $ vmware -v VMware Workstation 17.5.1 build-23298084$ lsb_release…...

1688商品列表API与其他数据源的对接思路

将1688商品列表API与其他数据源对接时&#xff0c;需结合业务场景设计数据流转链路&#xff0c;重点关注数据格式兼容性、接口调用频率控制及数据一致性维护。以下是具体对接思路及关键技术点&#xff1a; 一、核心对接场景与目标 商品数据同步 场景&#xff1a;将1688商品信息…...

对WWDC 2025 Keynote 内容的预测

借助我们以往对苹果公司发展路径的深入研究经验&#xff0c;以及大语言模型的分析能力&#xff0c;我们系统梳理了多年来苹果 WWDC 主题演讲的规律。在 WWDC 2025 即将揭幕之际&#xff0c;我们让 ChatGPT 对今年的 Keynote 内容进行了一个初步预测&#xff0c;聊作存档。等到明…...

12.找到字符串中所有字母异位词

&#x1f9e0; 题目解析 题目描述&#xff1a; 给定两个字符串 s 和 p&#xff0c;找出 s 中所有 p 的字母异位词的起始索引。 返回的答案以数组形式表示。 字母异位词定义&#xff1a; 若两个字符串包含的字符种类和出现次数完全相同&#xff0c;顺序无所谓&#xff0c;则互为…...

【JavaWeb】Docker项目部署

引言 之前学习了Linux操作系统的常见命令&#xff0c;在Linux上安装软件&#xff0c;以及如何在Linux上部署一个单体项目&#xff0c;大多数同学都会有相同的感受&#xff0c;那就是麻烦。 核心体现在三点&#xff1a; 命令太多了&#xff0c;记不住 软件安装包名字复杂&…...

零基础在实践中学习网络安全-皮卡丘靶场(第九期-Unsafe Fileupload模块)(yakit方式)

本期内容并不是很难&#xff0c;相信大家会学的很愉快&#xff0c;当然对于有后端基础的朋友来说&#xff0c;本期内容更加容易了解&#xff0c;当然没有基础的也别担心&#xff0c;本期内容会详细解释有关内容 本期用到的软件&#xff1a;yakit&#xff08;因为经过之前好多期…...

【学习笔记】erase 删除顺序迭代器后迭代器失效的解决方案

目录 使用 erase 返回值继续迭代使用索引进行遍历 我们知道类似 vector 的顺序迭代器被删除后&#xff0c;迭代器会失效&#xff0c;因为顺序迭代器在内存中是连续存储的&#xff0c;元素删除后&#xff0c;后续元素会前移。 但一些场景中&#xff0c;我们又需要在执行删除操作…...

9-Oracle 23 ai Vector Search 特性 知识准备

很多小伙伴是不是参加了 免费认证课程&#xff08;限时至2025/5/15&#xff09; Oracle AI Vector Search 1Z0-184-25考试&#xff0c;都顺利拿到certified了没。 各行各业的AI 大模型的到来&#xff0c;传统的数据库中的SQL还能不能打&#xff0c;结构化和非结构的话数据如何和…...

恶补电源:1.电桥

一、元器件的选择 搜索并选择电桥&#xff0c;再multisim中选择FWB&#xff0c;就有各种型号的电桥: 电桥是用来干嘛的呢&#xff1f; 它是一个由四个二极管搭成的“桥梁”形状的电路&#xff0c;用来把交流电&#xff08;AC&#xff09;变成直流电&#xff08;DC&#xff09;。…...

在RK3588上搭建ROS1环境:创建节点与数据可视化实战指南

在RK3588上搭建ROS1环境:创建节点与数据可视化实战指南 背景介绍完整操作步骤1. 创建Docker容器环境2. 验证GUI显示功能3. 安装ROS Noetic4. 配置环境变量5. 创建ROS节点(小球运动模拟)6. 配置RVIZ默认视图7. 创建启动脚本8. 运行可视化系统效果展示与交互技术解析ROS节点通…...