当前位置: 首页 > 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;而不…...

web vue 项目 Docker化部署

Web 项目 Docker 化部署详细教程 目录 Web 项目 Docker 化部署概述Dockerfile 详解 构建阶段生产阶段 构建和运行 Docker 镜像 1. Web 项目 Docker 化部署概述 Docker 化部署的主要步骤分为以下几个阶段&#xff1a; 构建阶段&#xff08;Build Stage&#xff09;&#xff1a…...

51c自动驾驶~合集58

我自己的原文哦~ https://blog.51cto.com/whaosoft/13967107 #CCA-Attention 全局池化局部保留&#xff0c;CCA-Attention为LLM长文本建模带来突破性进展 琶洲实验室、华南理工大学联合推出关键上下文感知注意力机制&#xff08;CCA-Attention&#xff09;&#xff0c;…...

c++ 面试题(1)-----深度优先搜索(DFS)实现

操作系统&#xff1a;ubuntu22.04 IDE:Visual Studio Code 编程语言&#xff1a;C11 题目描述 地上有一个 m 行 n 列的方格&#xff0c;从坐标 [0,0] 起始。一个机器人可以从某一格移动到上下左右四个格子&#xff0c;但不能进入行坐标和列坐标的数位之和大于 k 的格子。 例…...

微信小程序 - 手机震动

一、界面 <button type"primary" bindtap"shortVibrate">短震动</button> <button type"primary" bindtap"longVibrate">长震动</button> 二、js逻辑代码 注&#xff1a;文档 https://developers.weixin.qq…...

linux 错误码总结

1,错误码的概念与作用 在Linux系统中,错误码是系统调用或库函数在执行失败时返回的特定数值,用于指示具体的错误类型。这些错误码通过全局变量errno来存储和传递,errno由操作系统维护,保存最近一次发生的错误信息。值得注意的是,errno的值在每次系统调用或函数调用失败时…...

大学生职业发展与就业创业指导教学评价

这里是引用 作为软工2203/2204班的学生&#xff0c;我们非常感谢您在《大学生职业发展与就业创业指导》课程中的悉心教导。这门课程对我们即将面临实习和就业的工科学生来说至关重要&#xff0c;而您认真负责的教学态度&#xff0c;让课程的每一部分都充满了实用价值。 尤其让我…...

sipsak:SIP瑞士军刀!全参数详细教程!Kali Linux教程!

简介 sipsak 是一个面向会话初始协议 (SIP) 应用程序开发人员和管理员的小型命令行工具。它可以用于对 SIP 应用程序和设备进行一些简单的测试。 sipsak 是一款 SIP 压力和诊断实用程序。它通过 sip-uri 向服务器发送 SIP 请求&#xff0c;并检查收到的响应。它以以下模式之一…...

浪潮交换机配置track检测实现高速公路收费网络主备切换NQA

浪潮交换机track配置 项目背景高速网络拓扑网络情况分析通信线路收费网络路由 收费汇聚交换机相应配置收费汇聚track配置 项目背景 在实施省内一条高速公路时遇到的需求&#xff0c;本次涉及的主要是收费汇聚交换机的配置&#xff0c;浪潮网络设备在高速项目很少&#xff0c;通…...

JavaScript基础-API 和 Web API

在学习JavaScript的过程中&#xff0c;理解API&#xff08;应用程序接口&#xff09;和Web API的概念及其应用是非常重要的。这些工具极大地扩展了JavaScript的功能&#xff0c;使得开发者能够创建出功能丰富、交互性强的Web应用程序。本文将深入探讨JavaScript中的API与Web AP…...

MySQL 知识小结(一)

一、my.cnf配置详解 我们知道安装MySQL有两种方式来安装咱们的MySQL数据库&#xff0c;分别是二进制安装编译数据库或者使用三方yum来进行安装,第三方yum的安装相对于二进制压缩包的安装更快捷&#xff0c;但是文件存放起来数据比较冗余&#xff0c;用二进制能够更好管理咱们M…...