Java,File类与IO流,处理流:缓冲流、转换流、数据流、对象流
目录
处理流之一:缓冲流
四种缓冲流:
缓冲流的作用:
使用的方法:
处理文本文件的字符流:
处理非文本文件的字节流:
操作步骤:
处理流之二:转换流
转换流的使用:
使用转换流的步骤为:
处理流之三:数据流
DataOutputStream中的方法:
DataInputStream中的方法:
数据流的弊端:
处理流之四:对象流
对象流中的方法:
序列化机制:
自定义类实现序列化:
处理流之一:缓冲流
四种缓冲流:
BufferedInputStream、BufferedOutputStream、BufferedReader、BufferedWriter(对应相应的字节流,由名字即可判断)
缓冲流的作用:
提升文件读写的效率。
使用的方法:
处理文本文件的字符流:
BufferedReader read(char[ ] cbuffer) / readLine( )
BufferedWriter write(char[ ] cbuffer,0,len) / write(String) 、flush( ) (flush用于主动将内存中的数据写出到磁盘文件中)
处理非文本文件的字节流:
BufferedInputStream read(byte[ ] buffer)
BufferedOutputStream write(byte[ ] buffer,0,len)、flush( ) (flush用于主动将内存中的数据写出到磁盘文件中)
操作步骤:
①创建File的对象、文件流、缓冲流的对象
②使用缓冲流实现 读取数据 或 写出数据的过程:
读取:int read(char[ ] cbuffer)或int read(byte[ ] cbuffer)
写出:void write(char[ ] cbuffer,0, len) 或 void write(byte[ ] buffer,0, len)
③关闭资源
使用字节流复制文件的操作如下:
void test1()
{FileInputStream fis = null;FileOutputStream fos = null;BufferedInputStream bis = null;BufferedOutputStream bos = null;try{//1.创建相关File类的对象File srcFile = new File("输入流的图片文件.jpg");File destFile = new File("输出流的成功文件(使用缓冲流).jpg");//2.创建相关的字节流和缓冲流fis = new FileInputStream(srcFile);fos = new FileOutputStream(destFile);bis = new BufferedInputStream(fis);bos = new BufferedOutputStream(fos);//3.数据的读写操作byte[] buffer = new byte[1024];//1kbint len;//记录每次读入到buffer中的字节的个数while((len = bis.read(buffer)) != -1){bos.write(buffer,0,len);}} catch (IOException e){e.printStackTrace();} finally{//4.关闭资源//外层流的关闭(缓冲流),由于外层流的关闭会自动地内层流的关闭(节点流),所以可以省略内层流地关闭try{if (bis != null){bis.close();}} catch (IOException e){e.printStackTrace();}try{if (bos != null){bos.close();}} catch (IOException e){e.printStackTrace();}}
}
用缓冲流来进行文件的读写和复制操作:
使用缓冲流的步骤与普通节点流的使用步骤类似,只要在缓冲流的构造器中放入相应的节点流的构造器,读写的操作只要调用构造器即可。
在关闭资源的操作时,只要关闭外层流(缓冲流)的构造器,相应的内层流(节点流)也会关闭,所以只需要有缓冲流的资源的关闭即可。
读取操作:
void test1(){BufferedReader br = null;try{//1.创建File类的对象、流的对象File file = new File("要用缓冲流复制的文本文件");br = new BufferedReader(new FileReader(file));//2.读取操作//方式①
// char[] cbuffer = new char[20];
// int len;
// while((len = br.read(cbuffer)) != -1)
// {
// for (int i = 0; i < len; i++)
// {
// System.out.print(cbuffer[i]);
// }
// }//方式②:readLineString data;while((data = br.readLine()) != null){System.out.println(data);}} catch (IOException e){e.printStackTrace();}finally{//3.关闭资源try{br.close();} catch (IOException e){e.printStackTrace();}}}
复制操作:
void test2()
{BufferedReader br = null;BufferedWriter bw = null;try{//1.创建File类的对象,创建流的对象File file1 = new File("要用缓冲流复制的文本文件");File file2 = new File("使用缓冲流复制后的文本文件");br = new BufferedReader(new FileReader(file1));bw = new BufferedWriter(new FileWriter(file2));//2.文件的读写操作String data;while((data = br.readLine()) != null){bw.write(data);bw.newLine();}} catch (IOException e){e.printStackTrace();} finally{//3.关闭资源try{if(br != null){br.close();}} catch (IOException e){e.printStackTrace();}try{if(bw != null){bw.close();}} catch (IOException e){e.printStackTrace();}}
}
处理流之二:转换流
字符编码:字符、字符串、字符数组 ——> 字节、字节数组
字符解码:字节、字节数组 ——> 字符、字符串、字符数组
解码时使用的字符集必须与编码时的字符集一致。
转换流的使用:
①作用:转换流是字节与字符间的桥梁。实现字节和字符之间的转换。
②API:
InputStreamReader:将一个输入型的字节流转换为输入型的字符流。
OutputStreamWriter:将一个输出型的字符流转换为输出型的字节流。
若要将utf-8的文件转换为gbk的格式在控制台上显示,步骤如下:
void test1(){InputStreamReader isr = null;try{File f1 = new File("utf-8的文件");FileInputStream fis = new FileInputStream(f1);//isr = new InputStreamReader(fis);//此时使用idea默认的utf-8字符集isr = new InputStreamReader(fis,"gbk");char[] cbuffer = new char[20];int len;while((len = isr.read(cbuffer)) != -1){String str = new String(cbuffer,0,len);System.out.print(str);}} catch (IOException e){e.printStackTrace();} finally{try{if(isr != null)isr.close();} catch (IOException e){e.printStackTrace();}}}
会发现,控制台上的字符信息会出现乱码,所以,输入时,编码和解码使用的字符集要一致。
若要将utf-8的格式的文件转换为gbk格式的文件存储,步骤如下:
void test2()
{InputStreamReader isr = null;//解码和编码的字符集要一致。OutputStreamWriter osw = null;//参数要指明内存中的字符存储到文件中的字节过程使用的字符集。try{//1.造File对象File f1 = new File("utf-8的文件");File f2 = new File("gbk的文件");//2.造流FileInputStream fis = new FileInputStream(f1);isr = new InputStreamReader(fis,"utf-8");FileOutputStream fos = new FileOutputStream(f2);osw = new OutputStreamWriter(fos,"gbk");char[] cBuffer = new char[10];int len;while ((len = isr.read(cBuffer)) != -1){osw.write(cBuffer,0,len);}} catch (IOException e){e.printStackTrace();} finally{try{if (isr != null){isr.close();}} catch (IOException e){e.printStackTrace();}try{if (osw != null){osw.close();}} catch (IOException e){e.printStackTrace();}}
}
使用转换流的步骤为:
①将要操作的文件的File的对象作为参数,放入转换流的构造器中,创建转换流的对象。
注意:输入时,编码解码的字符集要一致,所以,InputStreamReader的对象的构造器中要放入与输入的文件一致的字符集。输出时,编码的字符集为相应的目标字符集,所以在OutputStreamWriter的对象的构造器中要放入相应的目标字符集。
②用InputStreamReader的对象和OutputStreamWriter的对象来进行相应的读写操作。
③关闭流资源
处理流之三:数据流
数据流:DataOutputStream、DataInputStream
DataOutputStream:将基本数据类型、String类型的变量写入输出流中,写出到文件中存储。
DataInputStream:从文件中读取基本数据类型、String类型的变量的数据,还原为基本数据类型、String类型的变量在内存中使用。
DataOutputStream中的方法:
| byte readByte() | int readInt() |
| float readFloat() | char readChar() |
| short readShort() | long readLong() |
| double readDouble() | boolean readBoolean() |
| String readUTF() (读取String类型的方法) | void readFully(byte[] b) (读取字节数组的方法) |
DataInputStream中的方法:
| byte writeByte() | int writeInt() |
| float writeFloat() | char writeChar() |
| short writeShort() | long writeLong() |
| double writeDouble() | boolean writeBoolean() |
| String readUTF() (写入String类型的变量的方法) | void readFully(byte[] b) (写入字节数组的变量的方法) |
数据流的弊端:
只支持基本数据类型和String类型的变量的读写,而不支持其他引用数据类型的读写。所以,涉及到其他的引用数据类型的读写,要使用对象流。
处理流之四:对象流
对象流:ObjectOutputStream、ObjectInputStream
ObjectOutputStream:将Java基本数据类型的的变量和引用数据类型的变量写入字节输出流中。通过在流中使用文件可以实现各种基本数据类型的的变量和引用数据类型的变量的数据在文件中存储。
ObjectInputStream:读取文件中存储的基本数据类型的的变量和引用数据类型的变量的数据,还原为基本数据类型的的变量和引用数据类型的变量,保存在内存中使用。
对象流中的方法:
对象流的方法也和数据流的相同,不过ObjectOutputStream多了一个void writeObjecct(Object obj),ObjectInputStream多了一个void readObject(Object obj)。
序列化机制:
序列化即把相应数据的信息转换为二进制流的信息以便于在硬盘或网络上存储。反序列化即把相应的二进制流的信息还原为相应数据的信息。
序列化过程使用的流:ObjectOutputStream流。将内存中的Java对象保存在文件中或通过网络传输出去。
例,要将一个String类型的对象存入指定文件中,操作如下:
void test1()
{ObjectOutputStream oos = null;try{//创建File的对象File file = new File("object.txt");oos = new ObjectOutputStream(new FileOutputStream(file));//写出数据,即序列化的过程String str = "jinitaimei";oos.writeUTF(str);} catch (IOException e){e.printStackTrace();} finally{//关闭资源try{if (oos != null){oos.close();}} catch (IOException e){e.printStackTrace();}}
}
反序列化过程使用的流:ObjectInputStream流。将文件中的数据或网络传输过来的数据还原为内存中的Java对象。
例,要将文件中存储的String类型的对象的数据还原为内存中的对象并将对象打印在控制台上,操作如下:
void test2()
{ObjectInputStream ois = null;try{File file = new File("object.txt");ois = new ObjectInputStream(new FileInputStream(file));String str1 = ois.readUTF();System.out.println(str1);} catch (IOException e){e.printStackTrace();} finally{try{if (ois != null){ois.close();}} catch (IOException e){e.printStackTrace();}}
}
自定义类实现序列化:
自定义类想要实现 序列化机制,需要满足:
①自定义类需要实现Serializable接口(Serializable属于一个标识接口)。
②要求自定义类声明一个全局常量:static final long serialVersionUID = (某个long类型的值,用来作为表示自定义类的唯一性的标识);
③要求自定义类的属性也必须是可序列化的。
·对于基本数据类型的属性:默认可序列化。
·对于引用数据类型的属性:相应的类要求实现Serializable接口,也要声明全局常量serialVersionUID,其中的属性也可序列化。
注意点:
①如果不声明全局常量serialVersionUID,系统会自动生成一个针对于当前类的serialVersionUID。如果对类修改之前存储了一个此类的对象在文件中或网络上(序列化),对类修改后,serialVersionUID的值也会变化,再要读取修改前读取的对象(反序列化),就会出现InvalidClassException异常。
②如果有某个属性不想序列化,在相应属性前加上transient关键字修饰,便不会被序列化。
③静态成员变量的值不会被序列化。因为静态成员变量的值不属于某个对象。
相关文章:
Java,File类与IO流,处理流:缓冲流、转换流、数据流、对象流
目录 处理流之一:缓冲流 四种缓冲流: 缓冲流的作用: 使用的方法: 处理文本文件的字符流: 处理非文本文件的字节流: 操作步骤: 处理流之二:转换流 转换流的使用: …...
【电路笔记】-分压器
分压器 文章目录 分压器1、概述2、负载分压器3、分压器网络4、无功分压器4.1 电容分压器4.2 感应分压器 5、总结 有时,需要精确的电压值作为参考,或者仅在需要较少功率的电路的特定阶段之前需要。 分压器是解决此问题的一个简单方法,因为它们…...
音视频5、libavformat-3
8、设置I/O中断机制 在 demux 时,我们首先需要调用 avformat_open_input() 打开一个输入,然后循环调用 av_read_frame() 函数来读取输入。 我们要注意的是: avformat_open_input() 和 av_read_frame() 都是阻塞函数,如果不能读取到足够的数据,那么它们将会一直阻塞…...
前端 HTML 和 JavaScript 的基础知识有哪些?
前端开发是Web开发的一个重要领域,涉及到HTML(Hypertext Markup Language)和JavaScript两个主要的技术。HTML用于定义网页的结构和内容,而JavaScript用于实现网页的交互和动态效果。以下是前端HTML和JavaScript的基础知识…...
Android平台GB28181设备接入模块开发填坑指南
技术背景 为什么要开发Android平台GB28181设备接入模块?这个问题不再赘述,在做Android平台GB28181客户端的时候,媒体数据这块,我们已经有了很好的积累,因为在此之前,我们就开发了非常成熟的RTMP推送、轻量…...
我叫:希尔排序【JAVA】
1.我兄弟存在的问题 2.毛遂自荐 希尔排序提希尔(Donald Shell)于1959年提出的一种排序算法。 希尔排序,也称递减增量排序算法,是插入排序的一种更高效的改进版本。但希尔排序是非稳定排序算法。 希尔排序是基于插入排序的以下两点性质而提出改进方法的&…...
Spring Cloud Gateway 网关跨域问题解决
0、版本说明 Spring Cloud Version:Spring Cloud 2021.0.4 Spring Cloud Gateway Version:3.1.4 Spring Boot Version:2.6.11 1、网关跨域问题说明 关于跨域的相关原理和理论,网上有大量文章对此进行说明,因此博主在这…...
C++局域网从服务器获取已连接用户的列表(linux to linux)
目录 服务器端 代码 客户端 代码解析 服务器端 原理 遇到的阻碍以及解决办法 客户端 原理 遇到的阻碍以及解决办法 运行结果截图 总结 服务器端 代码 #include <sys/types.h> #include <sys/socket.h> #include <stdio.h> #include <netinet…...
c++11新特性篇-可调用对象包装器, 绑定器
可调用对象包装器, 绑定器 可调用对象 可调用对象是指在 C 中能够像函数一样被调用的实体。它包括了多种类型的对象,使得它们能够像函数一样被调用,可以是函数、函数指针、函数对象、Lambda 表达式等。在C中,具有以下特征之一的实体都被认为…...
论文阅读:“Appearance Capture and Modeling of Human Teeth”
文章目录 AbstractIntroductionMethod OverviewTeeth Appearance ModelEnamelDentinGingiva and oral cavity Data AcquisitionImage captureGeometry capture ResultsReferences Abstract 如果要为电影,游戏或其他类型的项目创建在虚拟环境中显示的人类角色&#…...
初学vue3与ts:路由跳转带参数
index-router <!-- 路由跳转 --> <template><div><div class"title-sub flex"><div>1、用router-link跳转带参数id1:</div><router-link to"./link?id1"><button>点我跳转</button>&…...
JAVAEE---多线程
线程安全 这段代码执行结果就就是一个不确定的数,就存在线程安全问题。 为了解决这样的问题我们可以对count进行打包,我们知道count本质上应该是由三个指令完成,我们可以对其打包。 这样的代码结果就是正确的。我们对对象就进行了加锁&#…...
提示工程-Prompt Engineering
提示工程 提示工程 1、概述 Prompt Engineering: 提示工程 通过自然语言(英语、汉语等)来给AI下达指示,从而让AI完成你指定给他的工作的过程都可以称之为提示工程。(面向自然语言编程) 提示词要素 指令&…...
JetLinks设备接入的认识与理解【woodwhales.cn】
为了更好的阅读体验,建议移步至笔者的博客阅读:JetLinks设备接入的认识与理解 1、认识 JetLinks 1.1、官网文档 官网:https://www.jetlinks.cn/ JetLinks 有两个产品:JetLinks-lot和JetLinks-view 官方文档: JetLi…...
机器人开发的选择
喷涂机器人 码垛机器人 纸箱码垛机器人 焊接机器人 跳舞机器人 管道清理机器人 工地巡检机器人 点餐机器人 化工巡检机器人 装箱机器人 安防巡检机器人 迎宾机器人好像有点像软银那个 污水管道检测机器人 大酒店用扫地机器人 家用扫地机器人 工厂用(…...
LeetCode Hot100 102.二叉树的层序遍历
题目: 给你二叉树的根节点 root ,返回其节点值的 层序遍历 。 (即逐层地,从左到右访问所有节点)。 方法:迭代 class Solution {public List<List<Integer>> levelOrder(TreeNode root) {if …...
【Kotlin】类与接口
文章目录 类的定义创建类的实例构造函数主构造函数次构造函数init语句块 数据类的定义数据类定义了componentN方法 继承AnyAny:非空类型的根类型Any?:所有类型的根类型 覆盖方法覆盖属性覆盖 抽象类接口:使用interface关键字函数:funUnit:让…...
Wagtail-基于Python Django的内容管理系统CMS如何实现公网访问
Wagtail-基于Python Django的内容管理系统CMS实现公网访问 文章目录 Wagtail-基于Python Django的内容管理系统CMS实现公网访问前言1. 安装并运行Wagtail1.1 创建并激活虚拟环境 2. 安装cpolar内网穿透工具3. 实现Wagtail公网访问4. 固定的Wagtail公网地址 前言 Wagtail是一个…...
什么是LASSO回归,怎么看懂LASSO回归的结果
随着机器学习的发展,越来越多SCI文章都使用了更多有趣、高效的统计方法来进行分析,LASSO回归就是其中之一。很多小伙伴听说过LASSO,但是对于LASSO是什么,有什么用,怎么才能实现,大家可能一头雾水。今天的文…...
python树长子兄弟链存储结构(孩子兄弟链存储结构)
长子兄弟链存储结构(孩子兄弟链存储结构)解释: 长子兄弟链存储结构是一种树的存储结构,它使用孩子兄弟表示法(也称作左孩子右兄弟表示法)来表示树的结构。这种表示方法主要用于存储一般的树,而不…...
UE5 学习系列(二)用户操作界面及介绍
这篇博客是 UE5 学习系列博客的第二篇,在第一篇的基础上展开这篇内容。博客参考的 B 站视频资料和第一篇的链接如下: 【Note】:如果你已经完成安装等操作,可以只执行第一篇博客中 2. 新建一个空白游戏项目 章节操作,重…...
内存分配函数malloc kmalloc vmalloc
内存分配函数malloc kmalloc vmalloc malloc实现步骤: 1)请求大小调整:首先,malloc 需要调整用户请求的大小,以适应内部数据结构(例如,可能需要存储额外的元数据)。通常,这包括对齐调整,确保分配的内存地址满足特定硬件要求(如对齐到8字节或16字节边界)。 2)空闲…...
7.4.分块查找
一.分块查找的算法思想: 1.实例: 以上述图片的顺序表为例, 该顺序表的数据元素从整体来看是乱序的,但如果把这些数据元素分成一块一块的小区间, 第一个区间[0,1]索引上的数据元素都是小于等于10的, 第二…...
51c自动驾驶~合集58
我自己的原文哦~ https://blog.51cto.com/whaosoft/13967107 #CCA-Attention 全局池化局部保留,CCA-Attention为LLM长文本建模带来突破性进展 琶洲实验室、华南理工大学联合推出关键上下文感知注意力机制(CCA-Attention),…...
JavaScript 中的 ES|QL:利用 Apache Arrow 工具
作者:来自 Elastic Jeffrey Rengifo 学习如何将 ES|QL 与 JavaScript 的 Apache Arrow 客户端工具一起使用。 想获得 Elastic 认证吗?了解下一期 Elasticsearch Engineer 培训的时间吧! Elasticsearch 拥有众多新功能,助你为自己…...
Swift 协议扩展精进之路:解决 CoreData 托管实体子类的类型不匹配问题(下)
概述 在 Swift 开发语言中,各位秃头小码农们可以充分利用语法本身所带来的便利去劈荆斩棘。我们还可以恣意利用泛型、协议关联类型和协议扩展来进一步简化和优化我们复杂的代码需求。 不过,在涉及到多个子类派生于基类进行多态模拟的场景下,…...
基于Flask实现的医疗保险欺诈识别监测模型
基于Flask实现的医疗保险欺诈识别监测模型 项目截图 项目简介 社会医疗保险是国家通过立法形式强制实施,由雇主和个人按一定比例缴纳保险费,建立社会医疗保险基金,支付雇员医疗费用的一种医疗保险制度, 它是促进社会文明和进步的…...
测试markdown--肇兴
day1: 1、去程:7:04 --11:32高铁 高铁右转上售票大厅2楼,穿过候车厅下一楼,上大巴车 ¥10/人 **2、到达:**12点多到达寨子,买门票,美团/抖音:¥78人 3、中饭&a…...
渲染学进阶内容——模型
最近在写模组的时候发现渲染器里面离不开模型的定义,在渲染的第二篇文章中简单的讲解了一下关于模型部分的内容,其实不管是方块还是方块实体,都离不开模型的内容 🧱 一、CubeListBuilder 功能解析 CubeListBuilder 是 Minecraft Java 版模型系统的核心构建器,用于动态创…...
2025 后端自学UNIAPP【项目实战:旅游项目】6、我的收藏页面
代码框架视图 1、先添加一个获取收藏景点的列表请求 【在文件my_api.js文件中添加】 // 引入公共的请求封装 import http from ./my_http.js// 登录接口(适配服务端返回 Token) export const login async (code, avatar) > {const res await http…...
