IO流【 文件字符输入、出流;带缓冲区的字符输入、出流;对象流】

day36

IO流

字符流继承图

字符流继承图

字符流

继day35

应用场景:操作纯文本数据

注意:字符流 = 字节流+编译器

编译器:可以识别中文字符和非中文字符,非中文字符获取1个字节(一个字节=一个字符),编译器会根据编码格式获取中文字符对应的字节数(GBK获取两个字节,UTF-8获取三个字节)

abstract class Reader – 字符输入流的基类(抽象类)

abstract class Writer – 字符输出流的基类(抽象类)

class InputStreamReader extends Reader – 字符输入转换流

class OutputStreamWriter extends Writer – 字符输出转换流

特点:将字节流转换为字符流,字符转换流是字节流和字符流的桥梁

class FileReader extends InputStreamReader – 文件字符输入流

class FileWriter extends OutputStreamWriter – 文件字符输出流

class BufferedReader extends Reader – 带缓冲区的字符输入流

class BufferedWriter extends Writer – 带缓冲区的字符输出流

默认缓冲区:8192字符 – new char[8192]

文件字符输入、出流

利用 文件字符输出流 向文件写入数据

学习类比前面的学习思路,这里简化

	public static void main(String[] args) throws IOException {//1.创建流对象//FileWriter fw = new FileWriter("io.txt");//1.创建流对象FileWriter fw = new FileWriter("io.txt", true);//2.写入数据fw.write("迪士尼");//3.关闭资源fw.close();}
利用 文件字符输入流 读取文件里的数据
	public static void main(String[] args) throws IOException {//1.创建流对象FileReader fr = new FileReader("io.txt");//2.读取数据char[] cs = new char[1024];int len;while((len = fr.read(cs)) != -1){System.out.println(new String(cs, 0, len));}//3.关闭资源fr.close();}
拷贝文件

利用 文件字符输入、输出流

思路:读取源文件,写入目标文件

public class Copy {public static void main(String[] args) throws IOException {FileReader fr = new FileReader("小说.txt");FileWriter fw = new FileWriter("copy.txt");char[] cs = new char[1024];int len;while((len = fr.read(cs)) != -1){fw.write(cs, 0, len);}fr.close();fw.close();}
}

带缓冲区的字符输入、出流

利用 带缓冲区的字符输出流 向文件写入数据
public class Test01 {public static void main(String[] args) throws UnsupportedEncodingException, IOException {//1.创建流对象(文件字节输出流 -> 字符输出转换流 -> 带有缓冲区的字符输出流)//默认缓冲区大小:8192字符//BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(new FileOutputStream("io.txt"), "GBK"));//1.创建流对象(文件字节输出流 -> 字符输出转换流 -> 带有缓冲区的字符输出流)+ 末尾追加//默认缓冲区大小:8192字符//BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(new FileOutputStream("io.txt",true), "GBK"));//1.创建流对象(文件字符输出流 -> 带缓冲区的字符输出流)//默认缓冲区大小:8192字符//BufferedWriter bw = new BufferedWriter(new FileWriter("io.txt"));//1.创建流对象(文件字符输出流 -> 带缓冲区的字符输出流)+ 末尾追加//默认缓冲区大小:8192字符//BufferedWriter bw = new BufferedWriter(new FileWriter("io.txt",true));//1.创建流对象(文件字符输出流 -> 带缓冲区的字符输出流)+ 末尾追加 //自定义缓冲区大小:2048字符BufferedWriter bw = new BufferedWriter(new FileWriter("io.txt",true),2048);//2.写入数据bw.write("迪士尼");//3.关闭资源bw.close();	}
}
利用 带有缓冲区的字符输入流 读取文件里的数据
public class Test02 {public static void main(String[] args) throws UnsupportedEncodingException, IOException {//1.创建流对象(文件字节输入流 -> 字符输入转换流 -> 带有缓冲区的字符输入流)//默认缓冲区大小:8192字符//BufferedReader br = new BufferedReader(new InputStreamReader(new FileInputStream("io.txt"), "GBK"));//1.创建流对象(文件字节输入流 -> 字符输入转换流 -> 带有缓冲区的字符输入流)//默认缓冲区大小:8192字符//BufferedReader br = new BufferedReader(new FileReader("io.txt"));//1.创建流对象(文件字节输入流 -> 字符输入转换流 -> 带有缓冲区的字符输入流)//自定义缓冲区大小:2048字符BufferedReader br = new BufferedReader(new FileReader("io.txt"),2048);//2.读取数据char[] cs = new char[1024];int len;while((len = br.read(cs)) != -1){System.out.println(new String(cs, 0, len));}//3.关闭资源br.close();}
}
拷贝文件

利用 带有缓冲区的字符输入、输出流

思路:读取源文件,写入目标文件

方式1

public class Copy01 {public static void main(String[] args) throws IOException {BufferedReader br = new BufferedReader(new FileReader("小说.txt"));BufferedWriter bw = new BufferedWriter(new FileWriter("copy.txt"));char[] cs = new char[1024];int len;while((len = br.read(cs)) != -1){bw.write(cs, 0, len);}br.close();bw.close();}
}

方式2:行

public class Copy02 {public static void main(String[] args) throws IOException {BufferedReader br = new BufferedReader(new FileReader("小说.txt"));BufferedWriter bw = new BufferedWriter(new FileWriter("copy.txt"));//		String readLine;
//		while((readLine = br.readLine()) != null){
//			bw.write(readLine);//写一行
//			bw.newLine();//换行
//		}boolean bool = false;String readLine;while((readLine = br.readLine()) != null){//第一行不换行if(bool){bw.newLine();//换行}bw.write(readLine);//写一行bool = true;}br.close();bw.close();}
}

各种流

对象流

class ObjectInputStream – 对象输入流

class ObjectOutputStream – 对象输出流

理解:

​ 将程序中的对象写入到文件

​ 并且从文件中读取出对象到程序里

ps:服务器宕机,文件里的对象没事,又可以拿出来

序列化(钝化):将程序里的对象写入到文件

反序列化(活化):将文件里的对象读取到程序中

注意:

  1. 如果对象想写入文件,对象所属的类就必须实现序列化接口(Serializable)
  2. Serializable序列化接口没有任何的属性和方法,这种接口称之为标记型接口
  3. 对象所属的类实现了序列化接口一定要添加序列化ID(serialVersionUID)
  4. 属性使用transient修饰,该属性不会随着对象而写入到文件中
利用对象输出流 向文件写入数据
	public static void main(String[] args) throws FileNotFoundException, IOException {//1.创建流对象ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("io.txt"));//2.写入数据oos.writeInt(100);//写入int值oos.writeDouble(123.123);//写入double值oos.writeUTF("迪士尼");//写入字符串oos.writeObject(new Date());//写入对象//3.关闭资源oos.close();}
利用对象输入流 读取文件里的数据

取出来能用,看不懂其中内容正常,读取和写入顺序一致,不然会报错

	public static void main(String[] args) throws FileNotFoundException, IOException, ClassNotFoundException {//1.创建流对象ObjectInputStream ois = new ObjectInputStream(new FileInputStream("io.txt"));//2.读取数据(读取顺序必须和写入顺序一致)int readInt = ois.readInt();double readDouble = ois.readDouble();String str = ois.readUTF();Date date = (Date) ois.readObject();System.out.println(readInt);System.out.println(readDouble);System.out.println(str);System.out.println(date);//3.关闭资源ois.close();	}
利用对象输出流 向文件写入自定义对象

序列化id类似于版本,版本变化会导致读取不了的问题

public class User implements Serializable{//序列化接口private static final long serialVersionUID = 4907921883130742331L;//static final处理序列化idprivate String username;private transient String password;private String nickName;private String name;private String role;private double hp;private double mp;//无参、有参构造、get、set、toString方法【略】
}
public class Test03 {public static void main(String[] args) throws FileNotFoundException, IOException {//1.创建流对象ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("io.txt"));//2.写入自定义对象oos.writeObject(new User("1445584980", "123123", "昨夜的酒", "小小", "无极剑圣", 10000, 10000));oos.writeObject(new User("1534534534", "111222", "撕裂的忧伤", "大大", "九尾妖狐", 8000, 9000));oos.writeObject(new User("5345356683", "123456", "落日黄昏", "奇男子", "逆羽", 9000, 8000));oos.writeObject(null);//不加会导致对象输入流读取对象报错//3.关闭资源oos.close();}
}
利用对象输入流 读取文件中的自定义对象
public class Test04 {public static void main(String[] args) throws FileNotFoundException, IOException, ClassNotFoundException {//1.创建流对象ObjectInputStream ois = new ObjectInputStream(new FileInputStream("io.txt"));//2.读取自定义对象User user;while((user = (User)ois.readObject()) != null){System.out.println(user);}//3.关闭资源ois.close();}
}

内存流

打印流

随机访问流

总结

1.FileReader、FileWriter

2.BufferedReader、BufferedWriter
注意:缓冲区大小-8192字符

3.字符流继承图

4.ObjectInputStream、ObjectOutputStream
注意:
序列化接口
序列化、反序列的概念

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

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

相关文章

深入浅出Golang image库:编写高效的图像处理代码

深入浅出Golang image库:编写高效的图像处理代码 引言image库概览图像处理基础概念image库的主要组成和功能image接口图像格式的支持color模型 结论 图像的基本操作创建图像新图像的创建从文件加载图像 图像的保存与导出图像的颜色和像素处理绘制基本形状和文字 高级…

【开源社区】openEuler、openGauss、openHiTLS、MindSpore

【开源社区】openEuler、openGauss、openHiTLS、MindSpore 写在最前面开源社区参与和贡献的一般方式开源技术的需求和贡献方向 openEuler 社区:开源系统官方网站官方介绍贡献攻略开源技术需求 openGauss 社区:开源数据库官方网站官方介绍贡献攻略开源技术…

数据结构(三)----栈和队列

目录 一.栈 1.栈的基本概念 2.栈的基本操作 3.顺序栈的实现 •顺序栈的定义 •顺序栈的初始化 •进栈操作 •出栈操作 •读栈顶元素操作 •若使用另一种方式: 4.链栈的实现 •链栈的进栈操作 •链栈的出栈操作 •读栈顶元素 二.队列 1.队列的基本概念 2.队列的基…

关于ABP 新增表,dbfirst模式

下面的代码是基于abp生成的项目,项目名:Store 1.在Domain结尾的项目中通过EF工具生成数据实体: Scaffold-DbContext Data Source服务器IP;Initial Catalog数据库;User Idsa;Password密码;EncryptFalse; Microsoft.EntityFrameworkCore.SqlS…

Java基础_15集合及其方法

今天的内容 1.集合 1.集合【重点】 1.1为什么使用集合 集合和数组是一样的都是用来存储数据的!!! 真实的开发的时候,使用的是集合不是数组,为啥? 数组存数据: ​ 1.数组的容量是固定的 ​ 2.数组封装的方法…

慢品人间烟火色,闲观万事岁月长

小女孩的衣柜里,怎能缺少一套别致的新中式穿搭?让我们的小公主在时尚与传统中寻找平衡 演绎属于自己的中国风魅力精致的小立领,淡淡的文艺复古气息 上衣系带设计,外加一层高透轻纱穿上身如亭亭玉立的大小姐整个人仿佛笼罩了一层…

【docker】之linux写shell脚本备份线上数据库(备份为dump文件)

目录 1. SH文件1.1 SH文件示例1.2 文件解释1.3 .sh文件执行 2. 备份线上数据库的.sh文件2.1 文件命令解析 3. 命令执行4. 线下dump文件的恢复与备份 环境:linux容器:docker 1. SH文件 SH文件通常指的是 Shell 脚本文件,文件后缀名为.sh&…

IP查询在追踪网络攻击源头中的应用

随着网络攻击事件的不断增加,追踪攻击源头成为网络安全领域的重要任务之一。IP查询技术通过分析网络流量中的IP地址,可以帮助确定攻击的来源。本文将探讨IP查询在追踪网络攻击源头中的应用,包括其原理、方法以及实际案例分析。 IP地址查询&a…

比特币减半后 牛市爆发

作者:Arthur Hayes of Co-Founder of 100x 编译:Qin jin of ccvalue (以下内容仅代表作者个人观点,不应作为投资决策依据,也不应被视为参与投资交易的建议或意见)。 Ping PingPing,我的手机发出的声音&…

Linux CentOS 安装 MySQL 服务教程

Linux CentOS 安装 MySQL 服务教程 1. 查看系统和GNU C库(glibc)版本信息 1.1 查询机器 glibc 版本信息 glibc,全名GNU C Library,是大多数Linux发行版中使用的C库,为系统和应用程序提供核心的API接口。在Linux系统中,特别是在…

js 数组 按列循环二维数组

期待效果&#xff1a; 核心代码&#xff1a; //js function handle(array) {var result [];for (let i 0; i < array[0].length; i) {var item []; for (let j 0; j < array.length; j) {item.push(array[j][i])} result.push(item);} return result; } 运行代码&a…

酷开科技 | 酷开系统打破客厅局限让大家享受更智能便捷的服务

曾经电视是家庭场景中的重要屏幕&#xff0c;是家庭发现世界和获取资讯的中心。但经历了近一百年的发展&#xff0c;传统电视行业进入瓶颈期&#xff0c;电视在家庭中的地位被逐渐替代。特别是智能手机的诞生&#xff0c;让手机成为个人生活的中心和全社会关注焦点&#xff0c;…

STM32F7 MPU Cache的原理和一致性问题

目录 概述 1 Cache 及其原理 2 结构及策略 2.1 Cache类型 2.2 Cache实例 3 Cache 及 MPU 属性 4 Cache 一致性问题 4.1 未Clean写Cache情况 4.2 DMA 更新物理内存情况 4.3 一个实例 4.3.1 功能描述 4.3.2 代码实现 4.3.3 结论 概述 本文主要从结构原理以及应用方…

接口自动化测试(python+pytest+requests)

一、选取自动化测试用例 优先级高:先实现业务流程用例、后实现单接口用例功能较稳定的接口优先开展测试用例脚本的实现二、搭建自动化测试环境 核心技术:编程语言:python;测试框架:pytest;接口请求:requests安装/验证requests:命令行终端分别输入 pip install requests / p…

助力低碳出行 | 基于ACM32 MCU的电动滑板车方案

随着智能科技的快速发展&#xff0c;电动滑板车的驱动系统也得到了长足的发展。国内外的电动滑板车用电机驱动系统分为传统刷式电机和无刷电机两种类型。其中&#xff0c;传统的刷式电机已经逐渐被无刷电机所取代&#xff0c;无刷电机的性能和寿命都更出色&#xff0c;已成为电…

蓝桥杯-单片机基础16——利用定时计数中断进行动态数码管的多窗口显示

综合查阅了网络上目前能找到的所有关于此技能的代码&#xff0c;最终找到了下述方式比较可靠&#xff0c;且可以自定义任意显示的数值。 传统采用延时函数的方式实现动态数码管扫描&#xff0c;在题目变复杂时效果总是会不佳&#xff0c;因此在省赛中有必要尝试采用定时计数器中…

HCIP课后习题之一

1、路由协议用工作机制上分为那几种&#xff1f;分别是&#xff1f; A&#xff1a;两种。分别是静态路由和动态路由&#xff08;可分为IGP和EGP&#xff09; 2、IGP和EGP协议有哪些&#xff1f; A&#xff1a;IGP: RIP、OSPF、ISIS、EIGRP EGP: BGP 3、路由优先级的用途&…

嵌入式学习52-ARM1

知识零散&#xff1a; 1.flash&#xff1a; nor flash 可被寻地址 …

如何设置端口映射?

端口映射是一种网络技术&#xff0c;通过在网络路由器或防火墙上设置规则&#xff0c;将外部网络请求转发到内部特定设备或服务的端口上。这样可以实现不同地区电脑与电脑、设备与设备、电脑与设备之间的信息远程通信&#xff0c;提供更加便捷的网络连接。 2. 天联组网 天联是…

Day:005 | Python爬虫:高效数据抓取的编程技术(爬虫效率)

爬虫之多线程-了解 单线程爬虫的问题 因为爬虫多为IO密集型的程序&#xff0c;而IO处理速度并不是很快&#xff0c;因此速度不会太快如果IO卡顿&#xff0c;直接影响速度 解决方案 考虑使用多线程、多进程 原理&#xff1a; 爬虫使用多线程来处理网络请求&#xff0c;使用线程…