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

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向左移动一位&#xff0c…...

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 提供的服务可以确定设备的地理位置、高度和方向&#xff0c;或者它相对于附近 iBeacon 设备的位置。 该框架使用设备上的所…...

HashMap原理

初始化 从HashMap 源码中我们可以发现&#xff0c;HashMap的初始化有一下四种方式 //HashMap默认的初始容量大小 16&#xff0c;容量必须是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寄存器的父为标志位和备份区域中的寄存器以外&#xff0c;系统复位 将复位所有寄存器至它们的复位状态。 当发生以下任一事件时&#xff0c;产生一个系统复位&#xff1a; 1.NRST引脚上的 低 电平&#xff0c;即 外部复位&#xff1b;2…...

javaSE系列之方法与数组的使用

[TOC] javaSE系列之方法与数组的使用 方法的定义 方法类似于C语言中的"函数"。 方法的种类 这里方法分为有参方法也分为无参方法&#xff0c; 形参和实参是两个实体&#xff08;这里相当于函数的传值调用和传址调用&#xff09; 1.非静态方法&#xff1a;普通方法/…...

常用命令总结

将常用命令汇集于此&#xff0c;以便在忘记的时候查询&#xff0c;持续更新…… Git Local changes 添加名字&#xff1a; git config --global user.name "<你的名字>"添加邮件&#xff1a; git config --globa user.email "<你的邮箱>"…...

【Linux:程序地址空间--原来操作系统也喜欢画大饼】

目录 1 代码感受 2 进程地址空间 3 扩展 1 代码感受 在正式讲程序地址空间前我们先来看一段简单的代码来分析分析&#xff1a; 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…...

三大核心突破:构建企业级实时图表编辑系统的架构演进

三大核心突破&#xff1a;构建企业级实时图表编辑系统的架构演进 【免费下载链接】mermaid-live-editor Edit, preview and share mermaid charts/diagrams. New implementation of the live editor. 项目地址: https://gitcode.com/GitHub_Trending/me/mermaid-live-editor …...

Equalizer APO完整教程:免费系统级音频均衡器从入门到精通

Equalizer APO完整教程&#xff1a;免费系统级音频均衡器从入门到精通 【免费下载链接】equalizerapo Equalizer APO mirror 项目地址: https://gitcode.com/gh_mirrors/eq/equalizerapo Equalizer APO是一款功能强大的免费开源系统级音频均衡器软件&#xff0c;能够为W…...

告别枯燥理论!用eNSP模拟一次家庭/小型办公室无线组网:从AC配置、AP上线到手机连接全流程

告别枯燥理论&#xff01;用eNSP模拟一次家庭/小型办公室无线组网&#xff1a;从AC配置、AP上线到手机连接全流程 想象一下这样的场景&#xff1a;周末在家办公时&#xff0c;手机突然提示"Wi-Fi信号弱"&#xff1b;小型会议室里&#xff0c;同事们抱怨视频会议卡顿。…...

从FastCAE到你的项目:深度解析SARibbon控件在工业软件中的实战应用与避坑指南

从FastCAE到你的项目&#xff1a;深度解析SARibbon控件在工业软件中的实战应用与避坑指南 工业软件界面开发从来不是简单的UI堆砌&#xff0c;而是对工程效率与用户体验的极致追求。在CAE、CAD等专业领域&#xff0c;一个优秀的Ribbon控件往往能成为提升工程师工作效率的隐形利…...

ChatterUI本地模式深度解析:在移动设备上运行LLM的完整指南

ChatterUI本地模式深度解析&#xff1a;在移动设备上运行LLM的完整指南 【免费下载链接】ChatterUI Simple frontend for LLMs built in react-native. 项目地址: https://gitcode.com/gh_mirrors/ch/ChatterUI ChatterUI是一款基于React Native构建的轻量级LLM前端应用…...

深入Acid引擎架构:模块化设计与现代C++17的最佳实践指南

深入Acid引擎架构&#xff1a;模块化设计与现代C17的最佳实践指南 【免费下载链接】Acid A high speed C17 Vulkan game engine 项目地址: https://gitcode.com/gh_mirrors/ac/Acid Acid引擎是一个基于Vulkan API的高性能C17游戏引擎&#xff0c;采用先进的模块化架构设…...

第三篇:变量

一.变量 1.变量的创建 &#xff08;1&#xff09;语法格式&#xff1a;data_type name; 补充&#xff1a;其中“data_type"是数据类型&#xff0c;”name"是变量名&#xff0c;变量名根据需求随意取即可&#xff0c;但尽量取得有意义 例如&#xff1a;int age 10;(创…...

本地大模型推理引擎:高性能、可编程的部署与优化实战

1. 项目概述&#xff1a;一个为本地大模型打造的“瑞士军刀”式推理引擎如果你最近在折腾本地部署的大语言模型&#xff0c;比如Llama、Qwen或者DeepSeek&#xff0c;那你大概率遇到过这样的场景&#xff1a;模型文件下载好了&#xff0c;推理框架也装上了&#xff0c;但实际跑…...

AI编程入门指南:从提示词工程到实战工具配置

1. 项目概述&#xff1a;从“AI编程101”看个人开源项目的价值与路径最近在GitHub上看到一个挺有意思的项目&#xff0c;叫“ai-coding-101”&#xff0c;作者是jnMetaCode。光看这个标题&#xff0c;你大概就能猜到它的方向——一个面向AI辅助编程的入门指南。这类项目现在挺多…...

医疗设备软件设计的核心挑战与安全实践

1. 医疗设备软件设计的核心挑战医疗设备软件设计正面临着前所未有的复杂性和风险。作为一名在医疗设备行业工作多年的工程师&#xff0c;我亲眼见证了计算机技术如何彻底改变了这个领域。现代手术室和重症监护病房中&#xff0c;那些曾经独立的监护仪、输液泵和呼吸机&#xff…...