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

java学习--文件

简介

文件,对我们并不陌生,文件是保存数据的地方,比如大家经常使用的word文档,txt文
件,excel文件 ... 都是文件。它既可以保存一张图片,也可以保持视频,声音 ….

文件流

常用的文件操作

创建文件的对象相关构造器和方法

示范

方式一:

方式二:

老师演示:

获取文件的相关信息的方法

示范

老师演示

目录的操作以及文件的删除

示范

老师示范

创建多级目录


IO流原理及流的分类

原理

  1. I/O是Input/Output的缩写,I/O技术是非常实用的技术,用于处理数据传输。如读/写文件,网络通讯等。
  2. Java程序中,对于数据的输入/输出操作以”流(stream)”的方式进行。
  3. java.io包下提供了各种“流”类和接口,用以获取不同种类的数据,并通过方法输入或输出数据
  4. 输入input:读取外部数据(磁盘、光盘等存储设备的数据)到程序(内存)中。
  5. 输出output:将程序(内存)数据输出到磁盘、光盘等存储设备中

流的分类

  1. 按操作数据单位不同分为:字节流(8 bit),字符流(按字符)
  2. 按数据流的流向不同分为:输入流,输出流
  3. 按流的角色的不同分为:节点流,处理流/包装流
  4. Java的IO流共涉及40多个类,实际上非常规则,都是从如上4个抽象基类派生的
    由这四个类派生出来的子类名称都是以其父类名作为子类名后缀

IO流体系图-常用的类

InputStream:字节输入流

InputStream抽象类是所有类字节输入流的超类

 InputStream 常用的子类:
关系图:


FilelnputStream:文件输入流

FilelnputStream构造器以及方法摘要

read()方法详解


 

//字母占一个字节,但是一个汉字占三个字节。这样一个字节一个字节的读取会导致汉字乱码

一个一个字节读效率太低,所以就要用到read(byte[]b),自己指定一次读取几个字节,输出时,新建一个String其目的是将其转换成一个字符串打印出来,调用了这个构造器是代表通过使用平台的默认字符集对指定的字节子数组进行解码,构造一个新的字符串。新字符串的长度是字符集的函数,因此可能不等于子数组的长度。如果不用readata就会超过我们所有的字节数。

 read(byte[]b)方法详解

该方法的返回值

老师示范


BufferedlnputStream:缓冲字节输入流
ObjectlnputStream:对象字节输入流

OutputStream:字节输出流

 OutputStream 常用的子类:
FileOutputStream构造器以及方法摘要:
关系图:
常用的write方法

示范

构造器详解

示范

老师示范

文件拷贝

示范

老师示范

字符流

FileReader和 FileWriter 是字符流,即按照字符来操作io

 FileReader相关方法:

  1. new FileReader(File/String)
  2. read:每次读取单个字符,返回该字符,如果到文件末尾返回-1
  3. read(char[]):批量读取多个字符到数组,返回读取到的字符数,如果到文件末尾返回-1
  4. 相关API:
  • new String(char[]):将char[]转换成String
  • new String(char[],off,len):将char[]的指定部分转换成String
关系图:

示范:

老师示范:

FileWriter常用方法

  1. new FileWriter(File/String):覆盖模式,相当于流的指针在首端
  2. new FileWriter(File/String,true):追加模式,相当于流的指针在尾端
  3. write(int):写入单个字符
  4. write(char[]):写入指定数组
  5. write(char[],off,len):写入指定数组的指定部分
  6. write(string):写入整个字符串
  7. write(string,off,len):写入字符串的指定部分

相关API:String类:toCharArray:将String转换成char[]
注意::
FileWriter使用后,必须要关闭(close)或刷新(flush),否则写入不到指定的文生爱相

关系图:

示范:

追加添加

节点流和处理流

基本介绍

节点流和处理流一览图

关系图:

代表BufferWriter也是可以封装writer的子类

节点流和处理流的区别以及联系

处理流-BufferedReader和BufferedWriter(字符流

关系图:

示范

处理流BufferredInputStream(字节流)

BufferedInputStream是字节流,在创建 BufferedlnputStream时,会创建一个内部缓冲区数组.

构造器以及方法摘要

关系图:

父类及自己有的方法和属性,可以看到,BufferredInputStream的直接父类构造器有可传BufferredInputStream的直接父类的父类。并且BufferredInputStream自身也有,这代表他们都可以接收父类InputStream对象

输出的也是如此

示范:

老师示范:

对象流Object Input Stream和ObjectOutputStream

序列化和反序列化
  1. 序列化就是在保存数据时,保存数据的值和数据类型
  2. 反序列化就是在恢复数据时,恢复数据的值和数据类型
  3. 需要让某个对象支持序列化机制,则必须让其类是可序列化的,为了让某个类是可序列化的
  4. 类必须实现如下两个接口之一:
  • >Serializable //这是一个标记接口,没有方法,
  • >Externalizable//该接口有方法需要实现,因此我们一般实现上面的 Serializable接口

图解:

基本介绍
  • ObjectInputStream提供序列化功能
  • ObjectOutputStream提供反序列化功能

关系图:

都有相应的参数为outputstream/Inputstream这个父类的类型参数的构造器,而FileOutputStream/FileInputStream也为outputstream/Inputstream的子类,所以,ObjectInputStream和InputStream构造器也可以接收FileOutputStream/FileInputStream对象

抽象类

Integer类也是实现了

  • >Serializable //这是一个标记接口,没有方法,
  • >Externalizable//该接口有方法需要实现,因此我们一般实现上面的 Serializable接口

这两接口其中的Serializable,所以也是可以被序列化

当我们没有给dog类应用Serializable和Externalizable其中一个串口,则运行后会报错,无法去实例化。

注意:每个类型的实例化write方法都不一样,创建的一个类是

writeObject(),Bloolean类的是writeBoolean(),Char的是writeChar(),小数点的是writeDouble(),字符串的是writeUtF()等等

老师示范:

这个类型一定也要实现这两个其中一个接口

示范:

同样,反序列化的read各个类型也有所不同,规律跟序列化一样,如图:

注意事项和细节说明
  1. 读写顺序要一致
  2. 要求实现序列化或反序列化对象,需要 实现 Serializable
  3. 序列化的类中建议添加SerialVersionUID,为了提高版本的兼容性
  4. 序列化对象时,默认将里面所有属性都进行序列化,但除了static或transient修饰的成员
  5. 序列化对象时,要求里面属性的类型也需要实现序列化接口
  6. 序列化具备可继承性,也就是如果某类已经实现了序列化,则它的所有子类也已经默认实现了序列化

详解1:

序列化时,是先序列化dog类的,当反序列化时,不是先反序列化dog类则直接报错

其他详解

你加了版本号,那么就算你更改了Dog类比如,新增属性,也只会觉得是该类的升级版本。

当属性有Static和transient修饰时,序列化时,有这两属性的就不会被序列化,也就是说无法得到这两信息

这个类没有实现接口。那么就无法实现序列化,就导致整个dog类都无法实现从而报错

标准输入流输出流

转换流

InputStreamReader 和 OutputStreamWriter
介绍
  1. InputStreamReader:Reader的子类,可以将InputStream(字节流)包装成Reader(字符流)
  2.  OutputStreamWriter:Writer的子类,实现将OutputStream(字节流)包装成Writer(字符流)
  3. 当处理纯文本数据时,如果使用字符流效率更高,并且可以有效解决中文问题,所以建议将字节流转换成字符流
  4. 可以在使用时指定编码格式(比如 utf-8,gbk,gb2312,ISO8859-1等)

字节流可以转换成字符流,在转换之前可以改变编码

关系图:

值得一提的是,

FileInputStream/FileOutputStream为InputStream/OutputStream的子类,也就是说,可以指定要处理的编码,又FileInputStream/FileOutputStream为字节流,且BufferedReader和BufferedWriter与InputStreamReader 和 OutputStreamWriter同为Reader和Writer的子类,BufferedReader和BufferedWriter有构造器的参数为Reader/Writer,所以可以将通过InputStreamReader/OutputStreamWriter转换好编码的字节类数据包装成BufferedReader和BufferedWriter字符类,也就是说下列样式成立。
InputStreamReader inputStreamReader = new InputStreamReader(new FileInputStream("需要转码的文件路径","需要转的编码类型");
BufferedReader bufferedReader = new BufferedReader(inputStreamReader);
注意:虽然InputStreamReader/OutputStreamWriter本来就为字符类,但是他没有BufferedReader和BufferedWriter的一些便捷的方法,比如readLine(),newLine(),所以如果需要实现类似功能,可以包装成BufferedReader和BufferedWriter

示例:

老师示例

也可融合一句话写

打印流-PrintStream和PrintWriter(只有输入流无输出流)

关系图:

示范:

老师示范:

getBytes是将一个String类型的字符串中包含的字符转换成byte类型并且存入一个byte[]数组中

因为,Print Writer的构造器有接收Writer类的构造器,而FileWriter又为Writer的子类,所以可以创建个显示打印的文件。

Properties类

引入

传统方法读取:如果数据多了就很麻烦,如果指定得到一个值,还要加判断

基本介绍

示例:

在实现此过程遇到小插曲,地址怎么也不对,可以使用

// InputStream inputStream = 该.java文件名.class.getClassLoader().getResourceAsStream("需要获取的文件名及其后缀"); // properties.load(inputStream);来获取地址,在debug的时候可以查看到具体地址是什么

修改内容

代表注解注释,当加了注释,非null时

就会在开头加一句传入的注释

package com.File.test01;import java.io.BufferedWriter;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;/*
@author:我与java相爱相杀---c语言梦开始的地方
今天又是努力学习的一天!!!!
在判断d盘下是否有文件夹mytemp,如果没有就创建mytemp
在d:\\mytemp 目录下,创建文件 hello.txt
如果hello.txt 已经存在,提示该文件已经存在,就不要再重复创建了
*/public class Tets01 {public static void main(String[] args) throws IOException {String pathname="d:\\mytemp";File file = new File(pathname);if (file.exists())System.out.println("已存在");else{file.mkdir();String file02="d:\\mytemp\\hello.txt";File file1 = new File(file02);if (file1.exists())System.out.println("已存在");elsefile1.createNewFile();BufferedWriter writer = new BufferedWriter(new FileWriter(file1));writer.write("hello world!");writer.close();}}}

package com.File.test01;import java.io.*;/*
@author:我与java相爱相杀---c语言梦开始的地方
今天又是努力学习的一天!!!!
要求:使用BufferedReader读取一个文本文件,为每行加上行号,
再连同内容一并输出到屏幕上。
*/public class Test03 {public static void main(String[] args) throws IOException {// BufferedReader bufferedReader = new BufferedReader(new FileReader("d:\\mytemp\\hello.txt"));InputStreamReader inputStreamReader = new InputStreamReader(new FileInputStream("d:\\mytemp\\hello.txt"), "gbk");BufferedReader bufferedReader = new BufferedReader(inputStreamReader);String Link;int count=0;while ((Link=bufferedReader.readLine())!=null) {System.out.println(++count+Link);}bufferedReader.close();}
}

相关文章:

java学习--文件

简介 文件,对我们并不陌生,文件是保存数据的地方,比如大家经常使用的word文档,txt文 件,excel文件 ... 都是文件。它既可以保存一张图片,也可以保持视频,声音 …. 文件流 常用的文件操作 创建文件的对象相关构造器和方法 示范 方式一: 方式二: 老师演示…...

k8s—Prometheus+Grafana+Altermaneger构建监控平台

目录 一、安装node-exporter 1.下载所需镜像 2.编写node-export.yaml文件并应用 3.测试node-exporter并获取数据 二、Prometheus server安装和配置 1.创建sa(serviceaccount)账号,对sa做rabc授权 1)创建一个 sa 账号 monitor 2)把 sa …...

Dijkstra算法求解最短路径 自写代码

#include <iostream> #define Max 503 #define INF 0xcffffffusing namespace std;typedef struct AMGraph { //定义图int vex, arc;int arcs[Max][Max]; //邻接矩阵 };int dist[Max], path[Max]; //dis保存最短路径总权值、path通过保存路径的前驱结…...

C#如何对某个词在字符串中出现的次数进⾏计数(LINQ)

文章目录 基础知识实现方法基础计数LINQ优化处理标点符号总结 LINQ&#xff08;Language-Integrated Query&#xff09;是C#和VB.NET中强大的查询语言&#xff0c;它可以用来查询集合、SQL数据库、XML文档等。在C#中&#xff0c;我们可以使用LINQ来简化对字符串中特定单词出现次…...

Linux篇之OS层内核参数的调优

Linux内核参数调优 Linux 内核参数的调优和分类是一个复杂的主题&#xff0c;这涉及到系统性能、稳定性和安全性等多个方面。 内核参数主要可以分为以下几类&#xff1a; 1. 内核参数的分类 1.1 系统性能参数 这些参数影响系统的整体性能&#xff0c;包括 CPU 调度、内存管理…...

DLMS/COSEM中的信息安全:安全密钥(上)

加密密钥是一个参数,和加密算法一起使用,加密算法决定了这样一种方式,带有密钥的实体,可以重现和进行逆操作,而没有密钥则不能。对DLMS/COSEM的用途,操作的例子包含: ——明文转换成密文; ——密文转换成明文; ——计算和验证认证码(MAC); …...

Taro基础知识学习

一、安装及使用 CLI工具安装 需要使用 npm 或者 yarn 全局安装 tarojs/cli //使用 npm 安装 CLI npm install -g tarojs/cli//使用 yarn 安装 CLI yarn global add tarojs/cli//使用 cnpm 安装 CLI cnpm install -g tarojs/cli//使用npm info查看Taro的版本信息 npm info ta…...

浮点型在内存中的存储

前言 在上一期中我们讲到了有关于整型在内存中的存储&#xff0c;新朋友可以点开&#x1f517;了解一下&#xff0c;那这一期中我们将讲到的浮点数是不是存储方式和整型一致呢&#xff1f; 一、浮点数在内存中的存储 为了探究这个问题我们先来看一段代码 #include<stdio…...

微信小程序之behaviors

目录 概括 Demo演示 进阶演示 1. 若具有同名的属性或方法 2. 若有同名的数据 3. 若有同名的生命周期函数 应用场景 最后 属性&方法 组件中使用 代码示例&#xff1a; 同名字段的覆盖和组合规则 概括 一句话总结: behaviors是用于组件间代码共享的特性, 类似一…...

java.lang.NoClassDefFoundError: ch/qos/logback/core/util/StatusPrinter2

1、问题 SpringBoot升级报错&#xff1a; Exception in thread "main" java.lang.NoClassDefFoundError: ch/qos/logback/core/util/StatusPrinter2 类找不到&#xff1a; Caused by: java.lang.ClassNotFoundException: ch.qos.logback.core.util.StatusPrinter22、…...

WebRTC ICE配置类型

ICE&#xff08;Interactive Connectivity Establishment&#xff09;是一个用于建立WebRTC和其他实时通信会话中的点对点连接的框架。ICE协议通过尝试多个候选地址&#xff08;候选者&#xff09;来寻找最佳路径来连接两个对等端。ICE有多种配置类型&#xff0c;包括标准ICE、…...

制造知识普及(八)--企业内部物料编码(IPN)与制造商物料编码(MPN)

1、什么是物料编码 通常情况下&#xff0c;物料编码分两种&#xff0c;一种是企业内部物料编码&#xff08;IPN&#xff09;&#xff0c;由于在企业研发制造和生产中确认物料唯一性的&#xff0c;用于承载设计参数要求和技术要求。另一种是制造商物料编码&#xff08;MPN&…...

大模型学习笔记 - InstructGPT中的微调与对齐

LLM 微调 之 InstructGPT中的微调与对齐 LLM 微调 之 InstructGPT中的微调与对齐 技术概览 InstructGPT中的微调与对齐 大体步骤标注数据量模型训练 1. SFT 是如何训练的2. Reward Model是如何训练的3. RLHF 是如何训练的具体讲解RLHF 的loss 函数 模型效果参考链接&#xf…...

Unity近似的Transform实现

Unity近似的Transform实现 #include <stdint.h> #include<iomanip> #include <sstream>#include "Transform.h"//Transform::Transform(const Transform& a){ // LOGW("xww 2"); //}Transform::Transform(glm::vec3 localPositio…...

openvidu私有化部署

openvidu私有化部署 简介 OpenVidu 是一个允许您实施实时应用程序的平台。您可以从头开始构建全新的 OpenVidu 应用程序&#xff0c;但将 OpenVidu 集成到您现有的应用程序中也非常容易。 OpenVidu 基于 WebRTC 技术&#xff0c;允许开发您可以想象的任何类型的用例&#xf…...

基于深度学习的视频伪造检测

基于深度学习的视频伪造检测旨在利用深度学习技术来检测和识别伪造的视频内容。伪造视频&#xff0c;尤其是深伪&#xff08;Deepfake&#xff09;视频&#xff0c;近年来随着生成对抗网络&#xff08;GAN&#xff09;技术的发展&#xff0c;变得越来越逼真和难以识别。这对个人…...

python机器人编程——开发一个pymatlab工具箱(上)

目录 一、前言二、实现过程2.1 封装属性2.2 数据流化显示2.3 输入数据的适应性 三、核心代码说明3.1 设置缓存3.2 随机信号3.3 根据设置绘图 五、总结四、源码PS.扩展阅读ps1.六自由度机器人相关文章资源ps2.四轴机器相关文章资源ps3.移动小车相关文章资源 一、前言 我们知道m…...

输入类控件

目录 1.Line Edit 代码示例: 录入个人信息 代码示例: 使用正则表达式验证输入框的数据 代码示例: 验证两次输入的密码一致 代码示例: 切换显示密码 2.Text Edit 代码示例: 获取多行输入框的内容 代码示例: 验证输入框的各种信号 3.Combo Box 代码示例: 使用下拉框模拟…...

C++20中的模块

大多数C项目使用多个翻译单元(translation units)&#xff0c;因此它们需要在这些单元之间共享声明和定义(share declarations and definitions)。headers的使用在这方面非常突出。模块(module)是一种language feature&#xff0c;用于在翻译单元之间共享声明和定义。它们是某些…...

Selenium与流行框架集成:pytest与Allure报告

Selenium与流行框架集成&#xff1a;pytest与Allure报告 在现代软件开发中&#xff0c;自动化测试是确保产品质量和快速迭代的关键。Selenium作为业界领先的Web自动化测试工具&#xff0c;其灵活性和强大的功能受到广泛认可。为了进一步提升测试效率和报告质量&#xff0c;本文…...

大数据零基础学习day1之环境准备和大数据初步理解

学习大数据会使用到多台Linux服务器。 一、环境准备 1、VMware 基于VMware构建Linux虚拟机 是大数据从业者或者IT从业者的必备技能之一也是成本低廉的方案 所以VMware虚拟机方案是必须要学习的。 &#xff08;1&#xff09;设置网关 打开VMware虚拟机&#xff0c;点击编辑…...

基于当前项目通过npm包形式暴露公共组件

1.package.sjon文件配置 其中xh-flowable就是暴露出去的npm包名 2.创建tpyes文件夹&#xff0c;并新增内容 3.创建package文件夹...

对WWDC 2025 Keynote 内容的预测

借助我们以往对苹果公司发展路径的深入研究经验&#xff0c;以及大语言模型的分析能力&#xff0c;我们系统梳理了多年来苹果 WWDC 主题演讲的规律。在 WWDC 2025 即将揭幕之际&#xff0c;我们让 ChatGPT 对今年的 Keynote 内容进行了一个初步预测&#xff0c;聊作存档。等到明…...

OpenPrompt 和直接对提示词的嵌入向量进行训练有什么区别

OpenPrompt 和直接对提示词的嵌入向量进行训练有什么区别 直接训练提示词嵌入向量的核心区别 您提到的代码: prompt_embedding = initial_embedding.clone().requires_grad_(True) optimizer = torch.optim.Adam([prompt_embedding...

全志A40i android7.1 调试信息打印串口由uart0改为uart3

一&#xff0c;概述 1. 目的 将调试信息打印串口由uart0改为uart3。 2. 版本信息 Uboot版本&#xff1a;2014.07&#xff1b; Kernel版本&#xff1a;Linux-3.10&#xff1b; 二&#xff0c;Uboot 1. sys_config.fex改动 使能uart3(TX:PH00 RX:PH01)&#xff0c;并让boo…...

Element Plus 表单(el-form)中关于正整数输入的校验规则

目录 1 单个正整数输入1.1 模板1.2 校验规则 2 两个正整数输入&#xff08;联动&#xff09;2.1 模板2.2 校验规则2.3 CSS 1 单个正整数输入 1.1 模板 <el-formref"formRef":model"formData":rules"formRules"label-width"150px"…...

Python ROS2【机器人中间件框架】 简介

销量过万TEEIS德国护膝夏天用薄款 优惠券冠生园 百花蜂蜜428g 挤压瓶纯蜂蜜巨奇严选 鞋子除臭剂360ml 多芬身体磨砂膏280g健70%-75%酒精消毒棉片湿巾1418cm 80片/袋3袋大包清洁食品用消毒 优惠券AIMORNY52朵红玫瑰永生香皂花同城配送非鲜花七夕情人节生日礼物送女友 热卖妙洁棉…...

用机器学习破解新能源领域的“弃风”难题

音乐发烧友深有体会&#xff0c;玩音乐的本质就是玩电网。火电声音偏暖&#xff0c;水电偏冷&#xff0c;风电偏空旷。至于太阳能发的电&#xff0c;则略显朦胧和单薄。 不知你是否有感觉&#xff0c;近两年家里的音响声音越来越冷&#xff0c;听起来越来越单薄&#xff1f; —…...

Java + Spring Boot + Mybatis 实现批量插入

在 Java 中使用 Spring Boot 和 MyBatis 实现批量插入可以通过以下步骤完成。这里提供两种常用方法&#xff1a;使用 MyBatis 的 <foreach> 标签和批处理模式&#xff08;ExecutorType.BATCH&#xff09;。 方法一&#xff1a;使用 XML 的 <foreach> 标签&#xff…...

比较数据迁移后MySQL数据库和OceanBase数据仓库中的表

设计一个MySQL数据库和OceanBase数据仓库的表数据比较的详细程序流程,两张表是相同的结构,都有整型主键id字段,需要每次从数据库分批取得2000条数据,用于比较,比较操作的同时可以再取2000条数据,等上一次比较完成之后,开始比较,直到比较完所有的数据。比较操作需要比较…...