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树长子兄弟链存储结构(孩子兄弟链存储结构)
长子兄弟链存储结构(孩子兄弟链存储结构)解释: 长子兄弟链存储结构是一种树的存储结构,它使用孩子兄弟表示法(也称作左孩子右兄弟表示法)来表示树的结构。这种表示方法主要用于存储一般的树,而不…...
【Axure高保真原型】引导弹窗
今天和大家中分享引导弹窗的原型模板,载入页面后,会显示引导弹窗,适用于引导用户使用页面,点击完成后,会显示下一个引导弹窗,直至最后一个引导弹窗完成后进入首页。具体效果可以点击下方视频观看或打开下方…...
synchronized 学习
学习源: https://www.bilibili.com/video/BV1aJ411V763?spm_id_from333.788.videopod.episodes&vd_source32e1c41a9370911ab06d12fbc36c4ebc 1.应用场景 不超卖,也要考虑性能问题(场景) 2.常见面试问题: sync出…...
React第五十七节 Router中RouterProvider使用详解及注意事项
前言 在 React Router v6.4 中,RouterProvider 是一个核心组件,用于提供基于数据路由(data routers)的新型路由方案。 它替代了传统的 <BrowserRouter>,支持更强大的数据加载和操作功能(如 loader 和…...
《Playwright:微软的自动化测试工具详解》
Playwright 简介:声明内容来自网络,将内容拼接整理出来的文档 Playwright 是微软开发的自动化测试工具,支持 Chrome、Firefox、Safari 等主流浏览器,提供多语言 API(Python、JavaScript、Java、.NET)。它的特点包括&a…...
Java - Mysql数据类型对应
Mysql数据类型java数据类型备注整型INT/INTEGERint / java.lang.Integer–BIGINTlong/java.lang.Long–––浮点型FLOATfloat/java.lang.FloatDOUBLEdouble/java.lang.Double–DECIMAL/NUMERICjava.math.BigDecimal字符串型CHARjava.lang.String固定长度字符串VARCHARjava.lang…...
在四层代理中还原真实客户端ngx_stream_realip_module
一、模块原理与价值 PROXY Protocol 回溯 第三方负载均衡(如 HAProxy、AWS NLB、阿里 SLB)发起上游连接时,将真实客户端 IP/Port 写入 PROXY Protocol v1/v2 头。Stream 层接收到头部后,ngx_stream_realip_module 从中提取原始信息…...
基础测试工具使用经验
背景 vtune,perf, nsight system等基础测试工具,都是用过的,但是没有记录,都逐渐忘了。所以写这篇博客总结记录一下,只要以后发现新的用法,就记得来编辑补充一下 perf 比较基础的用法: 先改这…...
SpringBoot+uniapp 的 Champion 俱乐部微信小程序设计与实现,论文初版实现
摘要 本论文旨在设计并实现基于 SpringBoot 和 uniapp 的 Champion 俱乐部微信小程序,以满足俱乐部线上活动推广、会员管理、社交互动等需求。通过 SpringBoot 搭建后端服务,提供稳定高效的数据处理与业务逻辑支持;利用 uniapp 实现跨平台前…...
Web 架构之 CDN 加速原理与落地实践
文章目录 一、思维导图二、正文内容(一)CDN 基础概念1. 定义2. 组成部分 (二)CDN 加速原理1. 请求路由2. 内容缓存3. 内容更新 (三)CDN 落地实践1. 选择 CDN 服务商2. 配置 CDN3. 集成到 Web 架构 …...
【电力电子】基于STM32F103C8T6单片机双极性SPWM逆变(硬件篇)
本项目是基于 STM32F103C8T6 微控制器的 SPWM(正弦脉宽调制)电源模块,能够生成可调频率和幅值的正弦波交流电源输出。该项目适用于逆变器、UPS电源、变频器等应用场景。 供电电源 输入电压采集 上图为本设计的电源电路,图中 D1 为二极管, 其目的是防止正负极电源反接, …...
