3.13文件的IO操作
一.文件
1.定义
文件一般指的是存储在硬盘上的普通文件
形如:txt.jpg.mp4,rar等这些文件
在计算机中,文件可能是一个广义的概念,不仅可以包含普通文件,还可以包含目录(也就是文件夹.把目录称为目录文件)
在操作系统中,还会用文件来描述一些其他的硬件设备或者软件资源
比如网卡,显示器,键盘,操作系统都把这些设备视为文件
2.硬盘
普通文件是保存在硬盘上

硬盘的基本构造
1.盘片,存储数据的介质
2,磁头
机械硬盘一般插上电,里面的盘片就会高速运转,磁头就在盘片上找到对应的额数据
受限于机械硬盘结构:盘片转速越高,读写速度也就越快.机械硬盘往大容量的方向发展

3.文件的分类
1.文本文件->存储的是字符->文本文件本质上也是存字节但是在文本文件中,相邻的字节在一起正好能构成一个个字符
2.二进制文件->存储的是字节->>相邻的字节和字节之间没有关系
判断一个文件是文本还是二进制,
用记事本打开,打开是乱码 就是二进制,不是就是文本

.txt .c .java都属于文本文件
.doc ,ppt .exe .zip .class 都属于二进制文件

4,目录结构
计算机中爆粗能管理文件,是通过操作系统中的文件系统这样的模块来负责的
文件系统中.一般是通过"树形"结构来组织磁盘的目录和文件
就是数据结构中的N叉树

整体的文件系统.就是这样的树形结构
如果是一个普通文件,就是树的叶子结点
如果是一个目录文件目录中就可以包含子树,这个目录就是飞叶子节点
5.路径
操作系统中,路径表示一个具体文件/目录的位置
1.绝对路径,以盘符开头的

2.相对路径:以 . 开头(.表示当前路径)或者以..开头的(表示当前路径的父目录,也就是上级路径)
如果是相对路径,必须要现有一个基准目录
相对路径就是从基准目录出发,按照一个什么样的路径找到的额对应文件



二,操作文件
1.文件系统相关的操作
通过文件资源管理器能够完成的一些功能

在Java中提供一个File类,通过这个类来完成上述的操作
首先这个File类就描述了一个文件/目录
基于这个对象可以实现上面的功能
1.1FIle类
File的构造方法,能够传入一个路径,来指定文件,可以是绝对路径也可以是相对路径


1.2基准路径
基准路径是由运行的这个java程序确定
1)如果是通过命令行的形式,此时执行命令所在目录就是基准路径
2) 如果是通过IDEA的方式运行程序那么基准路径就是java项目所在的路径


3)将一个java代码达成war包.放到tomcat上运行,这种情况下,基准路径就是tomcat的bin目录

1.3路径之间的分隔符





1.4创建目录
mkdir 创建一级目录
mkdirs创建多级


2.流

stream :流

2.1 FileInputStream

read提供了三个版本得重载
1)无参数版本:一次读一个字节.返回值是读到的这个字节

如果返回的是byte,本身就是-128->+127
当读出了一个-1的时候,到底是读到文件末尾,还是说正好有个字节就是-1这个值(0xff)
为了表示这个非法状态,就约定了-1来表示,因此就需要使用一个比byte更大的范围
short或者int都行->short运算的时会自动转成int


public static void main(String[] args) {try {FileInputStream fileInputStream=new FileInputStream("./sun.txt");while(true){int a=fileInputStream.read();if(a==-1){break;}System.out.println(a);}} catch (IOException e) {e.printStackTrace();}}
这样还不够,需要关闭文件


这样太啰嗦了
java中提供一个语法.try with resource

这个代码中没有显示调用close.但是try会自动帮我们调用


2)一个参数版本:一次读若干个字节,把读的结果放到参数指定的数组中,返回值就是读到的字节数
3)三个参数版本:一次读若干个字节,把读的结果,放到参数指定的数组中,返回值就是读到的字节数
不是从数组的起始位置放.从off下标这个位置,len表示最多能放多少个字节

public static void main(String[] args) {try {FileInputStream fileInputStream=new FileInputStream("./sun.txt");while(true){int a=fileInputStream.read();if(a==-1){break;}System.out.println(a);}} catch (IOException e) {e.printStackTrace();}}
2.2fileOutputStream


不自动清空的话就设置为trye


3.删除文件
扫描指定目录,并找到名称中包含指定字符的所有普通文件,(不包含目录).后续询问用户是否要删除文件
要求:用户输入一个目录,再输入一个要删除的文件名
文件系统上的目录是一个树形结构
二叉树的遍历就是:先序,中序,后序,层序
N叉树也是同样的道理
思路:先输入目录,判断目录是否存在,构建一个查找函数然后再遍历,如果不是文件就递归
直到找到删除文件名,然后构造一个删除函数,询问用户并删除
这里注意,判断递归结束条件的时候不能错误的以传过来的scanFile
public static void main(String[] args) {Scanner sc=new Scanner(System.in);System.out.println("请输入你要扫描的路径");String scanDIr=sc.next();System.out.println("请输入你要删除的文件名");String toDeleteFile=sc.next();File scanFile=new File(scanDIr);if(!scanFile.isDirectory()){System.out.println("非法路径");return;}scaAndDelFile(scanFile,toDeleteFile);
}private static void scaAndDelFile(File scanFile, String toDeleteFile) {//1.先列出scanFile有哪些内容File[] files=scanFile.listFiles();if(files==null){return;//不能对传过来的scan进行判断,因为他既然能传过来就说明不是空的,只有可能他有这个容器但是他下面的东西是空的,}//2.分别列出来然后遍历for (File f:files){if(f.isFile()){if(f.getName().contains(toDeleteFile)){deleteFile(f);}}if (f.isDirectory()){scaAndDelFile(f,toDeleteFile);}}
}private static void deleteFile(File scanFile) {System.out.println("确定要删除吗>(Y/y)");Scanner scanner=new Scanner(System.in);String str=scanner.nextLine();if(str.equals("Y")||str.equals("y")){scanFile.delete();System.out.println("删除成功");}else{System.out.println("删除取消");return;}
}
4.复制文件
需要让用户指定两个文件路径,一个是原路径,一个是目标路径
打开源文件的文件,读取里面的内容,并写入到目标文件
扫描指定目录,并找到名称或者内容中包含指定字符的所有普通文件

public static void main(String[] args) {// 1. 输入两个路径Scanner scanner = new Scanner(System.in);System.out.println("请输入要拷贝的源路径: ");String src = scanner.next();System.out.println("请输入要拷贝的目标路径: ");String dest = scanner.next();File srcFile = new File(src);if (!srcFile.isFile()) {System.out.println("输入的源路径不正确!");return;}// 此处不太需要检查目标文件是否存在. OutputStream 写文件的时候能够自动创建不存在的文件.// 2. 读取源文件, 拷贝到目标文件中try (InputStream inputStream = new FileInputStream(src)) {try (OutputStream outputStream = new FileOutputStream(dest)) {// 把 inputStream 中的数据读出来, 写入到 outputStream 中byte[] buffer = new byte[1024];while (true) {int len = inputStream.read(buffer);if (len == -1) {// 读取完毕break;}// 写入的时候, 不能把整个 buffer 都写进去. 毕竟 buffer 可能是只有一部分才是有效数据.outputStream.write(buffer, 0, len);}}} catch (IOException e) {e.printStackTrace();}}
}
更高效的全文检索->倒排索引的结构
5..flush->刷新缓冲区
缓冲区存在的意义就是为了提高效率
CPU读取内存的速度远远高于硬盘
例如
①需要写数据到硬盘上,与其一次写一点,分多次,还不如把数据攒一起,统一写,这一堆待写的数据就是在内存中保存的,这块内存就叫缓冲区
②读操作也是类似,与其一次读一点,分多次多,不如一次性读一堆数据,然后再慢慢消化
③:写数据的时候需要把数据写到缓冲区,然后再统一写到硬盘上
如果当前缓冲区已经写满了,直接触发写硬盘操作
如果当前缓冲区没满,也想提前写硬盘,就可以通过flush手动刷新缓冲区
close操作也会触发缓冲区刷新
相关文章:

3.13文件的IO操作
一.文件1.定义文件一般指的是存储在硬盘上的普通文件形如:txt.jpg.mp4,rar等这些文件在计算机中,文件可能是一个广义的概念,不仅可以包含普通文件,还可以包含目录(也就是文件夹.把目录称为目录文件)在操作系统中,还会用文件来描述一些其他的硬件设备或者软件资源比如网卡,显示器…...

ffmpeg使用
1 下载FFmpeg安装 官网地址:https://www.ffmpeg.org/download.html#build-windows 进入网址,点击下面红框部分 点击下面范围进行下载,下载速度有点慢,等等吧! 下载成功后,解压后,复制bin的路…...
spark中的并行度(分区数)/分区器如何确定
源头RDD有自己的分区计算逻辑,一般没有分区器,并行度是根据分区算法自动计算的,RDD的compute函数中记录了数据如何而来,如何分区的hadoopRDD,根据XxxinputFormat.getInputSplits()来决定,比如默认的TextInputFormat将文…...

00后女生“云摆摊”两周赚1.5万,实体店转战线上真的能赚钱吗?
最近,山东临沂的00后女生利用小程序在线上“云摆摊”卖水果,两周赚1.5万,引发网友热议。不少人发出质疑的声音:年轻人不要有稳定的工作不做,去摆摊;网上开店成本低,开实体店结果就难说了&#x…...
华为OD机试题 - 最优资源分配(JavaScript)| 机考必刷
更多题库,搜索引擎搜 梦想橡皮擦华为OD 👑👑👑 更多华为OD题库,搜 梦想橡皮擦 华为OD 👑👑👑 更多华为机考题库,搜 梦想橡皮擦华为OD 👑👑👑 华为OD机试题 最近更新的博客使用说明本篇题解:最优资源分配题目输入输出描述备注示例一输入输出说明示例二输入…...
利用python判断字符串是否为回文
1 问题 如何用python判断字符串是否为回文。 2 方法 用两个变量left,right模仿指针(一个指向第一个字符,一个指向最后一个字符),每比对成功一次,left向右移动一位,right向左移动一位,…...

GDB 调用之ptype、set variable
今天在公司的时候,排查一个问题,创建l3 lif 失败,查看各种日志发现是用key去创建的 lif失败了,日志里指示key为空,导致的创建失败。原因为一个结构体比基线的多了一些东西,导致版本不对,既而计算…...

并发编程---阻塞队列(五)
阻塞队列一 阻塞队列1.1.阻塞队列概念1.2.阻塞队列API案例1.2.1. ArrayBlockingQueue1.2.1.1.抛出异常1.2.1.2.返回布尔1.2.1.3.阻塞1.2.1.4.超时1.2.2.SynchronousQueue二 阻塞队列应用---生产者消费者2.1.传统模式案例代码结果案例问题---防止虚假唤醒2.2.⽣产者消费者防⽌虚…...
本科课程【计算机组成原理】实验1 - 输出ABCD程序的生成
大家好,我是【1+1=王】, 热爱java的计算机(人工智能)渣硕研究生在读。 如果你也对java、人工智能等技术感兴趣,欢迎关注,抱团交流进大厂!!! Good better best, never let it rest, until good is better, and better best. 近期会把自己本科阶段的一些课程设计、实验报…...

Java并发编程(2) —— 线程创建的方式与原理
一、Java线程创建的三种方式 1. 继承Thread类并重写run()方法 ///方法一:使用匿名内部类重写Thread的run()方法Thread t1 new Thread() {Overridepublic void run() {try {sleep(10000);} catch (InterruptedException e) {e.printStackTrace();}log.debug("…...
你写的js性能有多差你知道吗 | js性能优化
性能的计算⽅式 确认⾃⼰需要关注的指标 常⻅的指标有: ⻚⾯总加载时间 load⾸屏时间⽩屏时间 代码 尝试⽤⼀个指令, 挂载在重要元素上, 当此元素inserted就上报 各个属性所代表的含义 connectStart, connectEnd 分别代表TCP建⽴连接和连接成功的时间节点。如果浏…...

线程的状态、状态之间的相互转换
目录 一、线程的状态 1. NEW 2. TERMINATED 3. RUNNABLE 4. TIMED_WAITING 5. BLOCKED 6. WAITING 二、线程状态转换 1. 线程状态转换简图 一、线程的状态 线程的状态一共有 6 种: NEW:安排了工作,还未开始行动(调用 st…...

Java8使用Lambda表达式(流式)快速实现List转map 、分组、过滤等操作
利用java8新特性,可以用简洁高效的代码来实现一些数据处理。1 数据准备1.1 定义1个Fruit对象package com.wkf.workrecord.work;import org.junit.Test;import java.math.BigDecimal; import java.util.ArrayList; import java.util.List;/*** author wuKeFan* date …...

C++之深浅拷贝
一、浅拷贝 我们看下以下代码 Test.h 文件 #pragma once #include<iostream> using namespace std; class Student { public:Student(){}~Student(){if (m_Id ! nullptr){delete m_Id;m_Id nullptr;}}Student(int id, string strName){m_Id new int[id];m_strName s…...
CoreLocation的一切
Overview 概述 [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-pgnvehxf-1678717852996)(./blog_cover.png)] Core Location 提供的服务可以确定设备的地理位置、高度和方向,或者它相对于附近 iBeacon 设备的位置。 该框架使用设备上的所…...
HashMap原理
初始化 从HashMap 源码中我们可以发现,HashMap的初始化有一下四种方式 //HashMap默认的初始容量大小 16,容量必须是2的幂 static final int DEFAULT_INITIAL_CAPACITY 1 << 4; // HashMap最大容量 static final int MAXIMUM_CAPACITY 1 <&…...

STM32入门笔记(02):独立看门狗(IWDG)和窗户看门狗(WWDG)(SPL库函数版)
1.IWDG狗简介 除了始终控制器的RCC_CSR寄存器的父为标志位和备份区域中的寄存器以外,系统复位 将复位所有寄存器至它们的复位状态。 当发生以下任一事件时,产生一个系统复位: 1.NRST引脚上的 低 电平,即 外部复位;2…...

javaSE系列之方法与数组的使用
[TOC] javaSE系列之方法与数组的使用 方法的定义 方法类似于C语言中的"函数"。 方法的种类 这里方法分为有参方法也分为无参方法, 形参和实参是两个实体(这里相当于函数的传值调用和传址调用) 1.非静态方法:普通方法/…...
常用命令总结
将常用命令汇集于此,以便在忘记的时候查询,持续更新…… Git Local changes 添加名字: git config --global user.name "<你的名字>"添加邮件: git config --globa user.email "<你的邮箱>"…...

【Linux:程序地址空间--原来操作系统也喜欢画大饼】
目录 1 代码感受 2 进程地址空间 3 扩展 1 代码感受 在正式讲程序地址空间前我们先来看一段简单的代码来分析分析: 1 #include<iostream>2 #include<unistd.h>3 using namespace std;4 5 int g_val100;6 7 int main()8 {9 pid_t idfork();10 if(i…...

Linux应用开发之网络套接字编程(实例篇)
服务端与客户端单连接 服务端代码 #include <sys/socket.h> #include <sys/types.h> #include <netinet/in.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #include <arpa/inet.h> #include <pthread.h> …...

大型活动交通拥堵治理的视觉算法应用
大型活动下智慧交通的视觉分析应用 一、背景与挑战 大型活动(如演唱会、马拉松赛事、高考中考等)期间,城市交通面临瞬时人流车流激增、传统摄像头模糊、交通拥堵识别滞后等问题。以演唱会为例,暖城商圈曾因观众集中离场导致周边…...
IGP(Interior Gateway Protocol,内部网关协议)
IGP(Interior Gateway Protocol,内部网关协议) 是一种用于在一个自治系统(AS)内部传递路由信息的路由协议,主要用于在一个组织或机构的内部网络中决定数据包的最佳路径。与用于自治系统之间通信的 EGP&…...

Swift 协议扩展精进之路:解决 CoreData 托管实体子类的类型不匹配问题(下)
概述 在 Swift 开发语言中,各位秃头小码农们可以充分利用语法本身所带来的便利去劈荆斩棘。我们还可以恣意利用泛型、协议关联类型和协议扩展来进一步简化和优化我们复杂的代码需求。 不过,在涉及到多个子类派生于基类进行多态模拟的场景下,…...

前端导出带有合并单元格的列表
// 导出async function exportExcel(fileName "共识调整.xlsx") {// 所有数据const exportData await getAllMainData();// 表头内容let fitstTitleList [];const secondTitleList [];allColumns.value.forEach(column > {if (!column.children) {fitstTitleL…...

最新SpringBoot+SpringCloud+Nacos微服务框架分享
文章目录 前言一、服务规划二、架构核心1.cloud的pom2.gateway的异常handler3.gateway的filter4、admin的pom5、admin的登录核心 三、code-helper分享总结 前言 最近有个活蛮赶的,根据Excel列的需求预估的工时直接打骨折,不要问我为什么,主要…...

el-switch文字内置
el-switch文字内置 效果 vue <div style"color:#ffffff;font-size:14px;float:left;margin-bottom:5px;margin-right:5px;">自动加载</div> <el-switch v-model"value" active-color"#3E99FB" inactive-color"#DCDFE6"…...

(二)原型模式
原型的功能是将一个已经存在的对象作为源目标,其余对象都是通过这个源目标创建。发挥复制的作用就是原型模式的核心思想。 一、源型模式的定义 原型模式是指第二次创建对象可以通过复制已经存在的原型对象来实现,忽略对象创建过程中的其它细节。 📌 核心特点: 避免重复初…...
使用van-uploader 的UI组件,结合vue2如何实现图片上传组件的封装
以下是基于 vant-ui(适配 Vue2 版本 )实现截图中照片上传预览、删除功能,并封装成可复用组件的完整代码,包含样式和逻辑实现,可直接在 Vue2 项目中使用: 1. 封装的图片上传组件 ImageUploader.vue <te…...

Maven 概述、安装、配置、仓库、私服详解
目录 1、Maven 概述 1.1 Maven 的定义 1.2 Maven 解决的问题 1.3 Maven 的核心特性与优势 2、Maven 安装 2.1 下载 Maven 2.2 安装配置 Maven 2.3 测试安装 2.4 修改 Maven 本地仓库的默认路径 3、Maven 配置 3.1 配置本地仓库 3.2 配置 JDK 3.3 IDEA 配置本地 Ma…...