Java研学-IO流(三)

六 字节流 – 字节输出流系列 OutPutStream体系

1 OutPutStream系列 – 字节输出流

// 表示字节输出流所有类的超类,输出流接受输出字节并将其发送到某个接收器
public abstract class OutputStream

FileOutputStream/BufferedOutputStream

2 FileOutputStream类设计

// 用于写入如图像数据的原始字节流,可实例化OutPutStream对象
public class FileOutputStream// 当前路径下创建指定名字的文件
public FileOutputStream(String name)// 例子
public class Test {public static void main(String[] args) {FileOutputStream fo=null;try {fo=new FileOutputStream("play2.txt");// public void write(byte[] bs)  写入字节数组// public void write(int b)  写入一个字节// public void write(byte[] bs,int start,int len)  写入字节数组,自指定位置始写指定长度fo.write(97);  // afo.write("\r\n".getBytes());  // 换行fo.write("这里是一段文字通过字符串转换".getBytes(),0,12);// 这里是一 2字节1汉字} catch (FileNotFoundException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();} finally {if (fo!=null){try {fo.close();} catch (IOException e) {e.printStackTrace();}}}}
}

  由于计算机中底层操作的都是字节数据,而OutputStream正好也是字节流,因此可以直接将数据写入到指定文件中,不需flush

3 BufferedOutputStream类设计 需flush

// 该类实现缓冲输出流,可直接向底层输入流写入字节
public class BufferedOutputStream// 通过传递OutputStream实现类对象完成对文件的操作
public BufferedOutputStream(OutputStream out)// 例子
public class Test {public static void main(String[] args) {BufferedOutputStream bo=null;try {bo=new BufferedOutputStream(new FileOutputStream("play.txt"));bo.write(66);bo.write("\r\n".getBytes());bo.write("烤鸡翅膀我最爱吃".getBytes(),0,12);// 烤鸡翅膀  1汉字2字节bo.flush();} catch (FileNotFoundException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();} finally {if(bo!=null){try {bo.close();} catch (IOException e) {e.printStackTrace();}}}}
}

  BufferedOutputStream不能直接将数据写入到指定文件中,因为其操作的是缓存区,需要将数据刷新到指定的文件中:,建议使用BufferedOutputStream操作字节流可降低内存资源的消耗

七 字节流 – 字节输入流系列 InputStream体系

1 InputStream系列 – 字节输入流

// InputStream 类设计
Class InputStream

FileInputStream/BufferedInputStream

2 FileInputStream类设计

// 用于读取图像等数据的原始字节流
public class FileInputStream// 打开与实际文件的链接创建FileInputStream文件,由name命名读取文件中的数据,可实例化 InputStream类对象
public FileInputStream(String name)// 例子
public class Test {public static void main(String[] args) {FileInputStream fi=null;try {fi=new FileInputStream("play.txt");int data=0;byte[] bs=new byte[1024*5];while ((data=fi.read(bs))!=-1){System.out.println(new String(bs,0,data));}} catch (FileNotFoundException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();} finally {try {fi.close();} catch (IOException e) {e.printStackTrace();}}}
}

  一个汉字(包括数字)在UTF-8编码下占用3个字节,在GBK编码下占用2个字节。因此,如果4个汉字存储需要12个字节,那么可以推断出这些汉字是在UTF-8编码下存储的。具体存储方式是将每个汉字转换为UTF-8编码下的3个字节,共计12个字节存储。

3 BufferedInputStream类设计

// 直接操作缓存区降低内存消耗
public class BufferedInputStream// 读取InputStream 参数实现类指定的文件,创建一个BufferedInputStream并保存其参数,内部缓冲区数组创建并存在buf
public BufferedInputStream(InputStream in)// 例子
public class Test {public static void main(String[] args) {BufferedInputStream bi=null;try {bi=new BufferedInputStream(new FileInputStream("play.txt"));int data=0;byte[] bs=new byte[1024*5];while ((data=bi.read(bs))!=-1){System.out.println(new String(bs,0,data));}} catch (FileNotFoundException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();} finally {try {if(bi!=null){bi.close();}} catch (IOException e) {e.printStackTrace();}}}
}

字节流小结

  字节流高效流(带有Buffered缓存技术的流),没有像字符流那样提供高效的方法(newLine()和readLine());定义字节高效流的原因,就是操作缓存区代替直接操作系统底层,降低系统资源消耗;

八 例子

将指定盘符下的指定文件,复制粘贴到指定的盘符

public class FC {// 实现盘符下文件的读写操作,startName原文件名,endName目标文件名public void copy(String startName,String endName){// 分别定义两个字符高效流对象BufferedReader start=null;BufferedWriter end=null;try {// 分别实例化对象start=new BufferedReader(new FileReader(startName));end=new BufferedWriter(new FileWriter(endName));String data=null;while ((data=start.readLine())!=null){// 读一行写一行end.write(data);end.newLine();end.flush();}} catch (FileNotFoundException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();} finally {// 防止start.close();出现异常导致end.close();无法关闭// 关闭多个异常时需要分别关,关闭资源操作是没有顺序的if (start!=null){try {start.close();} catch (IOException e) {e.printStackTrace();}}if (end!=null){try {end.close();} catch (IOException e) {e.printStackTrace();}}}}
}

九 序列化

1 流转换

在这里插入图片描述
开发中可使用更高效的替代品

InputStreamReader – System.in — Scanner

OutPutStreamWriter – System.out.print()

2 序列化与反序列化

① 序列化:指使用指定的技术(OutputStream流,ObjectOutputStream类),将对象中的数据(通过对象调用方法获取的结果),存储到指定的文件中(也就是写的过程),或通过网络上传的过程

② 反序列化:将指定文件中或网络上的对象中的数据获取到(也就是读操作InputStream流,ObjectInputStream类)

// 创建序列化对象
public class Dog implements Serializable {// 将序列化号固定为常量private static final long serialVersionUID=1L;// Serializable接口是一个声明接口,他没有任何抽象方法,但想实现序列化反序列化操作必须实现它private String name;private int kg;public  Dog(){super();}public Dog(String name, int kg) {super();this.name = name;this.kg = kg;}public String getName() {return name;}public void setName(String name) {this.name = name;}public int getKg() {return kg;}public void setKg(int kg) {this.kg = kg;}@Overridepublic String toString() {return "Dog{" +"name='" + name + '\'' +", kg='" + kg + '\'' +'}';}
}// 序列化
public class DXTest {public static void main(String[] args) {// 声明序列化操作流对象ObjectOutputStream oo=null;try {oo=new ObjectOutputStream(new FileOutputStream("play.txt"));// 实例化需序列化的对象Dog yellow = new Dog("大黄",24);// public void writeObject(Object obj) 将序列化对象写入流中(需要flush)oo.writeObject(yellow);oo.flush();} catch (FileNotFoundException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();} finally {if(oo!=null){try {oo.close();} catch (IOException e) {e.printStackTrace();}}System.out.println("成功上传");}}
}// 反序列化
public class DFTest {public static void main(String[] args) {// 声明反序列化对象ObjectInputStream oi=null;try {oi=new ObjectInputStream(new FileInputStream("play.txt"));// public Object readObject() 将文件中的对象读出来 序列化对象接收是Object因此需要强转Dog yellow= (Dog) oi.readObject();System.out.println(yellow.toString());} catch (FileNotFoundException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();} catch (ClassNotFoundException e) {e.printStackTrace();} finally {if(oi!=null){try {oi.close();} catch (IOException e) {e.printStackTrace();}}}}
}

  上传数据(序列化),是将数据以字节码的形式存储到指定的文件中,打开文件之后,无法直接阅读,需要下载(反序列化)后才能阅读
  在类的序列化过程中,如果添加新的属性,需要再次进行序列化和反序列化,这样同步操作才能不报错,如果一个没做,就会出现类无效异常 java.io.InvalidClassException

// 其中 stream classdesc serialVersionUID = 4216129340136042751 是本地读取类的序列化号
// local class serialVersionUID = 8800134341386811038 是本次已经存在的序列化号
java.io.InvalidClassException: com.Test.Dog; local class incompatible: stream classdesc serialVersionUID = 4216129340136042751, local class serialVersionUID = 8800134341386811038

  读取就是反序列化操作;而已存在就是序列化操作,两个版本号不同就会出现异常
  为了避免异常的出现,序列化后版本号进行固定;一般在实现序列化接口后,在类中(Dog类)将序列化号直接定义为常量

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

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

相关文章

pyqt5使用pyqtgraph实现动态热力图

pyqt5使用pyqtgraph实现动态热力图 一、效果图 二、流程 1、打开Designer创建一个UI界面 2、把UI转成py 3、创建一个main.py文件 4、在main文件中渲染画布、创建初始数据、画热力图、创建更新数据线程、绑定按钮触发事件三、UI界面 其中h_map.py代码如下: # -*- coding: ut…

1688API接口系列,1688开放平台接口使用方案(商品详情数据+搜索商品列表+商家订单类)

1688商品详情接口是指1688平台提供的API接口,用于获取商品详情信息。通过该接口,您可以获取到商品的详细信息,包括商品标题、价格、库存、描述、图片等。 要使用1688商品详情接口,您需要先申请1688的API权限,并获取ac…

变量和引用

变量和引用 2.1.深入认识变量 2.1.1.什么是变量 变量是在程序中保存用户数据的一段内存存储空间,变量名是内存空间的首地址 变量三要素:名称、类型、值 2.1.2.变量的名称 组成: 字母、数字、下划线组成,不能以数字开头 变量名称的长…

蓝桥杯每日一题2023.12.2

题目描述 蓝桥杯大赛历届真题 - C 语言 B 组 - 蓝桥云课 (lanqiao.cn) 题目分析 答案:3598180 由题目分析可以知道,给小明发的牌一共有13种类型,每种类型的牌一共有四张。对于每种牌,我们都有5种选择,不拿、拿一张、…

LeetCode - 965. 单值二叉树(C语言,二叉树,配图)

二叉树每个节点都具有相同的值,我们就可以比较每个树的根节点与左右两个孩子节点的值是否相同,如果不同返回false,否则,返回true。 如果是叶子节点,不存在还孩子节点,则这个叶子节点为根的树是单值二叉树。…

分析实现HarmonyOS中的Linux内核架构模式

在当今的科技领域,操作系统是各种智能设备运行的关键所在。而在这方面,华为的鸿蒙系统备受瞩目。那么,鸿蒙系统技术架构是怎样的呢?本文将为您揭开这一神秘面纱。 首先,我们需要了解鸿蒙系统的基本架构。鸿蒙系统采用…

mysql中除了InnoDB以外的其它存储引擎

参考资料:https://dev.mysql.com/doc/refman/8.0/en/storage-engines.html MyISAM存储引擎 https://dev.mysql.com/doc/refman/8.0/en/myisam-storage-engine.html MyISAM 存储引擎是基于比较老的ISAM存储引擎(ISAM已经不再可用)&#xff…

shell编程系列(11)-使用grep查找文本

文章目录 前言grep的使用根据关键字查找反向查找 结语 前言 grep命令也是我们在日常使用linux,编写shell脚本中会用到的一个高频命令,grep主要是帮助我们查找我们想要的内容,类似于我们在office word里面的 Ctrl f 查找功能,但是…

SLURM资源调度管理系统REST API服务配置,基于slurm22.05.9,centos9stream默认版本

前面给大家将了一下slurm集群的简单配置,这里给大家再提升一下,配置slurm服务的restful的api,这样大家可以将slurm服务通过api整合到桌面或者网页端,通过桌面或者网页界面进行管理。 1、SLURM集群配置 这里请大家参考&#xff1…

使用C语言创建高性能爬虫ip网络

之前写的python和GO语言的爬虫ip池的文章引起很大反响,这次我将以C语言来创建爬虫IP池,但是因为其复杂性,可能代码并非完美。但是最终也达到的想要的效果。 因为在C语言中创建代理IP池可能会比较复杂,且C语言并没有像Python那样的…

07-原型模式-C语言实现

原型模式: Specify the kinds of objects to create using a prototypical instance,and create new objects by copying this prototype.(用原型实例指定创建对象的种类, 并且通过拷贝这些原型创建新的对象。 ) UML图&#xff1…

关于 Kubernetes中Admission Controllers(准入控制器) 认知的一些笔记

写在前面 工作中遇到,简单整理记忆博文为官方文档整理涉及内置准入控制的分类理解理解不足小伙伴帮忙指正 人活着就是为了忍受摧残,一直到死,想明了这一点,一切事情都能泰然处之 —— 王小波《黄金时代》 为什么需要准入控制器 准…

非得让你会之MyBatis插件与Java动态代理

引言 咱们今天聊聊Java动态代理,这东西在开发中真的太常见了。比如Spring AOP、RPC,它们都离不开动态代理。然后,咱们再来说说MyBatis插件,这可是MyBatis框架中的一个超实用的功能,它就像是给MyBatis加了个“超能力”…

『测试基础』| 如何理解测试用例管理和缺陷管理?

『测试管理攻略』| 如何理解测试用例管理和缺陷管理? 1 测试用例定义2 测试用例设计原则3 测试用例的评审4 测试如何维护?5 用例的作用6 用例管理工具7 缺陷关注的重点8 缺陷分析9 缺陷管理工具 1 测试用例定义 测试用例(TestCase&#xff0…

12.1平衡树(splay),旋转操作及代码

平衡树 变量定义 tot表示结点数量,rt表示根的编号 v[i]表示结点i的权值 fa[i]表示结点i的父亲节点 chi[i][2]表示结点i的左右孩子 cnt[i]表示结点i的权值存在数量,如1123,v[3]1,则cnt[3]2;就是说i3的三号结点的权值为1&…

树和二叉树的基本概念和堆的实现

树的概念及结构 树的概念 树是一种非线性的数据结构,它是由n(n>0)个有限结点组成一个具有层次关系的集合。把它叫做树是因为它看起来像一棵倒挂的树,也就是说它是根朝上,而叶朝下的。 1.有一个特殊的结点&#…

04-配置远程仓库的SSH免密登陆

配置SSH免密登录 配置步骤 创建好的远程仓库也可以使用SSH的方式进行访问,但如果没有配置公钥会有警告 第一步: 删除用户家目录下的.ssh目录,如果没有该目录或者该目录下已经有密钥了就不用执行该操作 #进入当前用户的家目录,删除.ssh 目录 LayneLAPTOP-Layne MINGW64 ~ $ r…

python datetime 获取特定一天的后一天或者后几天

这里写自定义目录标题 1 获取特定天的时间对象 具体时间格式参考:Python time strptime()和strftime()-CSDN博客 import datetimetimer datetime.datetime.strptime(date, "%Y-%m-%d")2 获取下一天或者【下x天】的数据并进行格式转换 # 下一天数据 ne…

基于SpringBoot+Vue的前后端分离的房屋租赁系统2

✌全网粉丝20W,csdn特邀作者、博客专家、CSDN新星计划导师、java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ 🍅文末获取项目下载方式🍅 一、项目背景介绍: 开发过程中&#xff0…

uniApp打包的手机app如果用户没开启通知权限、引导用户开启

封装一个setPermissions.js文件 /*** 如果用户没开启通知权限、引导用户开启 */ export function setPermissions() {// #ifdef APP-PLUS if (plus.os.name Android) {var main plus.android.runtimeMainActivity();var pkName main.getPackageName();var uid main.getApp…