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

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流,处理流:缓冲流、转换流、数据流、对象流

目录 处理流之一&#xff1a;缓冲流 四种缓冲流&#xff1a; 缓冲流的作用&#xff1a; 使用的方法&#xff1a; 处理文本文件的字符流&#xff1a; 处理非文本文件的字节流&#xff1a; 操作步骤&#xff1a; 处理流之二&#xff1a;转换流 转换流的使用&#xff1a; …...

【电路笔记】-分压器

分压器 文章目录 分压器1、概述2、负载分压器3、分压器网络4、无功分压器4.1 电容分压器4.2 感应分压器 5、总结 有时&#xff0c;需要精确的电压值作为参考&#xff0c;或者仅在需要较少功率的电路的特定阶段之前需要。 分压器是解决此问题的一个简单方法&#xff0c;因为它们…...

音视频5、libavformat-3

8、设置I/O中断机制 在 demux 时,我们首先需要调用 avformat_open_input() 打开一个输入,然后循环调用 av_read_frame() 函数来读取输入。 我们要注意的是: avformat_open_input() 和 av_read_frame() 都是阻塞函数,如果不能读取到足够的数据,那么它们将会一直阻塞…...

前端 HTML 和 JavaScript 的基础知识有哪些?

前端开发是Web开发的一个重要领域&#xff0c;涉及到HTML&#xff08;Hypertext Markup Language&#xff09;和JavaScript两个主要的技术。HTML用于定义网页的结构和内容&#xff0c;而JavaScript用于实现网页的交互和动态效果。以下是前端HTML和JavaScript的基础知识&#xf…...

Android平台GB28181设备接入模块开发填坑指南

技术背景 为什么要开发Android平台GB28181设备接入模块&#xff1f;这个问题不再赘述&#xff0c;在做Android平台GB28181客户端的时候&#xff0c;媒体数据这块&#xff0c;我们已经有了很好的积累&#xff0c;因为在此之前&#xff0c;我们就开发了非常成熟的RTMP推送、轻量…...

我叫:希尔排序【JAVA】

1.我兄弟存在的问题 2.毛遂自荐 希尔排序提希尔(Donald Shell)于1959年提出的一种排序算法。 希尔排序&#xff0c;也称递减增量排序算法&#xff0c;是插入排序的一种更高效的改进版本。但希尔排序是非稳定排序算法。 希尔排序是基于插入排序的以下两点性质而提出改进方法的&…...

Spring Cloud Gateway 网关跨域问题解决

0、版本说明 Spring Cloud Version&#xff1a;Spring Cloud 2021.0.4 Spring Cloud Gateway Version&#xff1a;3.1.4 Spring Boot Version&#xff1a;2.6.11 1、网关跨域问题说明 关于跨域的相关原理和理论&#xff0c;网上有大量文章对此进行说明&#xff0c;因此博主在这…...

C++局域网从服务器获取已连接用户的列表(linux to linux)

目录 服务器端 代码 客户端 代码解析 服务器端 原理 遇到的阻碍以及解决办法 客户端 原理 遇到的阻碍以及解决办法 运行结果截图 总结 服务器端 代码 #include <sys/types.h> #include <sys/socket.h> #include <stdio.h> #include <netinet…...

c++11新特性篇-可调用对象包装器, 绑定器

可调用对象包装器, 绑定器 可调用对象 可调用对象是指在 C 中能够像函数一样被调用的实体。它包括了多种类型的对象&#xff0c;使得它们能够像函数一样被调用&#xff0c;可以是函数、函数指针、函数对象、Lambda 表达式等。在C中&#xff0c;具有以下特征之一的实体都被认为…...

论文阅读:“Appearance Capture and Modeling of Human Teeth”

文章目录 AbstractIntroductionMethod OverviewTeeth Appearance ModelEnamelDentinGingiva and oral cavity Data AcquisitionImage captureGeometry capture ResultsReferences Abstract 如果要为电影&#xff0c;游戏或其他类型的项目创建在虚拟环境中显示的人类角色&#…...

初学vue3与ts:路由跳转带参数

index-router <!-- 路由跳转 --> <template><div><div class"title-sub flex"><div>1、用router-link跳转带参数id1&#xff1a;</div><router-link to"./link?id1"><button>点我跳转</button>&…...

JAVAEE---多线程

线程安全 这段代码执行结果就就是一个不确定的数&#xff0c;就存在线程安全问题。 为了解决这样的问题我们可以对count进行打包&#xff0c;我们知道count本质上应该是由三个指令完成&#xff0c;我们可以对其打包。 这样的代码结果就是正确的。我们对对象就进行了加锁&#…...

提示工程-Prompt Engineering

提示工程 提示工程 1、概述 Prompt Engineering&#xff1a; 提示工程 通过自然语言&#xff08;英语、汉语等&#xff09;来给AI下达指示&#xff0c;从而让AI完成你指定给他的工作的过程都可以称之为提示工程。&#xff08;面向自然语言编程&#xff09; 提示词要素 指令&…...

JetLinks设备接入的认识与理解【woodwhales.cn】

为了更好的阅读体验&#xff0c;建议移步至笔者的博客阅读&#xff1a;JetLinks设备接入的认识与理解 1、认识 JetLinks 1.1、官网文档 官网&#xff1a;https://www.jetlinks.cn/ JetLinks 有两个产品&#xff1a;JetLinks-lot和JetLinks-view 官方文档&#xff1a; JetLi…...

机器人开发的选择

喷涂机器人 码垛机器人 纸箱码垛机器人 焊接机器人 跳舞机器人 管道清理机器人 工地巡检机器人 点餐机器人 化工巡检机器人 装箱机器人 安防巡检机器人 迎宾机器人好像有点像软银那个 污水管道检测机器人 大酒店用扫地机器人 家用扫地机器人 工厂用&#xff08;…...

LeetCode Hot100 102.二叉树的层序遍历

题目&#xff1a; 给你二叉树的根节点 root &#xff0c;返回其节点值的 层序遍历 。 &#xff08;即逐层地&#xff0c;从左到右访问所有节点&#xff09;。 方法&#xff1a;迭代 class Solution {public List<List<Integer>> levelOrder(TreeNode root) {if …...

【Kotlin】类与接口

文章目录 类的定义创建类的实例构造函数主构造函数次构造函数init语句块 数据类的定义数据类定义了componentN方法 继承AnyAny&#xff1a;非空类型的根类型Any?&#xff1a;所有类型的根类型 覆盖方法覆盖属性覆盖 抽象类接口:使用interface关键字函数&#xff1a;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回归的结果

随着机器学习的发展&#xff0c;越来越多SCI文章都使用了更多有趣、高效的统计方法来进行分析&#xff0c;LASSO回归就是其中之一。很多小伙伴听说过LASSO&#xff0c;但是对于LASSO是什么&#xff0c;有什么用&#xff0c;怎么才能实现&#xff0c;大家可能一头雾水。今天的文…...

python树长子兄弟链存储结构(孩子兄弟链存储结构)

长子兄弟链存储结构&#xff08;孩子兄弟链存储结构&#xff09;解释&#xff1a; 长子兄弟链存储结构是一种树的存储结构&#xff0c;它使用孩子兄弟表示法&#xff08;也称作左孩子右兄弟表示法&#xff09;来表示树的结构。这种表示方法主要用于存储一般的树&#xff0c;而不…...

Objective-C常用命名规范总结

【OC】常用命名规范总结 文章目录 【OC】常用命名规范总结1.类名&#xff08;Class Name)2.协议名&#xff08;Protocol Name)3.方法名&#xff08;Method Name)4.属性名&#xff08;Property Name&#xff09;5.局部变量/实例变量&#xff08;Local / Instance Variables&…...

定时器任务——若依源码分析

分析util包下面的工具类schedule utils&#xff1a; ScheduleUtils 是若依中用于与 Quartz 框架交互的工具类&#xff0c;封装了定时任务的 创建、更新、暂停、删除等核心逻辑。 createScheduleJob createScheduleJob 用于将任务注册到 Quartz&#xff0c;先构建任务的 JobD…...

在Ubuntu中设置开机自动运行(sudo)指令的指南

在Ubuntu系统中&#xff0c;有时需要在系统启动时自动执行某些命令&#xff0c;特别是需要 sudo权限的指令。为了实现这一功能&#xff0c;可以使用多种方法&#xff0c;包括编写Systemd服务、配置 rc.local文件或使用 cron任务计划。本文将详细介绍这些方法&#xff0c;并提供…...

【android bluetooth 框架分析 04】【bt-framework 层详解 1】【BluetoothProperties介绍】

1. BluetoothProperties介绍 libsysprop/srcs/android/sysprop/BluetoothProperties.sysprop BluetoothProperties.sysprop 是 Android AOSP 中的一种 系统属性定义文件&#xff08;System Property Definition File&#xff09;&#xff0c;用于声明和管理 Bluetooth 模块相…...

数据库分批入库

今天在工作中&#xff0c;遇到一个问题&#xff0c;就是分批查询的时候&#xff0c;由于批次过大导致出现了一些问题&#xff0c;一下是问题描述和解决方案&#xff1a; 示例&#xff1a; // 假设已有数据列表 dataList 和 PreparedStatement pstmt int batchSize 1000; // …...

聊一聊接口测试的意义有哪些?

目录 一、隔离性 & 早期测试 二、保障系统集成质量 三、验证业务逻辑的核心层 四、提升测试效率与覆盖度 五、系统稳定性的守护者 六、驱动团队协作与契约管理 七、性能与扩展性的前置评估 八、持续交付的核心支撑 接口测试的意义可以从四个维度展开&#xff0c;首…...

2025季度云服务器排行榜

在全球云服务器市场&#xff0c;各厂商的排名和地位并非一成不变&#xff0c;而是由其独特的优势、战略布局和市场适应性共同决定的。以下是根据2025年市场趋势&#xff0c;对主要云服务器厂商在排行榜中占据重要位置的原因和优势进行深度分析&#xff1a; 一、全球“三巨头”…...

vue3 daterange正则踩坑

<el-form-item label"空置时间" prop"vacantTime"> <el-date-picker v-model"form.vacantTime" type"daterange" start-placeholder"开始日期" end-placeholder"结束日期" clearable :editable"fal…...

Linux中《基础IO》详细介绍

目录 理解"文件"狭义理解广义理解文件操作的归类认知系统角度文件类别 回顾C文件接口打开文件写文件读文件稍作修改&#xff0c;实现简单cat命令 输出信息到显示器&#xff0c;你有哪些方法stdin & stdout & stderr打开文件的方式 系统⽂件I/O⼀种传递标志位…...

云原生安全实战:API网关Envoy的鉴权与限流详解

&#x1f525;「炎码工坊」技术弹药已装填&#xff01; 点击关注 → 解锁工业级干货【工具实测|项目避坑|源码燃烧指南】 一、基础概念 1. API网关 作为微服务架构的统一入口&#xff0c;负责路由转发、安全控制、流量管理等核心功能。 2. Envoy 由Lyft开源的高性能云原生…...