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

文件操作/IO

文件

文件是一种在硬盘上存储数据的方式,操作系统帮我们把硬盘的一些细节都封装起来了,程序员只需要了解文件相关的接口即可,相当于操作文件就是间接的操作硬盘了
硬盘用来存储数据,和内存相比硬盘的存储空间更大,访问速度更慢,成本更低,持久化存储,操作系统通过“文件系统”这样的模块来管理硬盘
在这里插入图片描述
不同的文件系统管理文件的方式都是类似的
通过目录(directory,平常叫文件夹,专业术语叫目录)构成了N叉树的树形结构
我们在文件系统中都是通过路径来确定一个具体的文件
在这里插入图片描述
在这里插入图片描述
同样是一个cat.jpg文件,站在不同的基准目录上,查找的路径是不相同的

文件系统上存储的文件,具体来说又分成两大类
1.文本文件–存储的是字符
字符怎么定义呢?
有个表叫utf8,这个表上数据的组合就是字符
2.二进制文件–存储的是二进制数据
判断文本文件和二进制文件最简单的方式就是
直接用记事本打开,如果打开之后能看懂,就是文本,否则就是二进制

像word文档,ppt,excel这些,如果托到记事本上,都是二进制文件,虽然word文档里存的东西是汉字等可以看懂的内容,但是word文档不仅仅包含我们自己输入的内容,还有行间距,文字格式等众多内容
但是如果把excel的后缀改成csv格式,就是文本文件了
在这里插入图片描述

Java标准库中操作文件(对文件系统操作)

操作文件可以理解成通过java代码把你硬盘的文件删除修改创建等,也就是通过java代码操作文件系统
Java 中通过 java.io.File 类来对一个文件(包括目录)进行抽象的描述。注意, File 对象可以对应到一个真实存在的文件,也可以对应到一个不存在的文件
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

获取文件路径

public static void main(String[] args) throws IOException {File file=new File("./test.txt");System.out.println(file.getParent());//上级目录System.out.println(file.getName());//文件名System.out.println(file.getPath());//new File后面的是什么路径,就输出什么System.out.println(file.getAbsolutePath());//工作目录拼接上当前目录   在idea中运行一个程序,工作目录就是项目所在的目录System.out.println(file.getCanonicalPath());//对getAbsolutePath的这个路径进行了修饰,让这个路径没有多余的东西,比如那个.}

在这里插入图片描述

创建文件

public static void main(String[] args) {File file=new File("./test.txt");System.out.println(file.exists());//在当前项目所在的路径下(D:\code\Java\java-related-code\File)没有test.txt这个文件,应该是falseSystem.out.println(file.isFile());//都没有这个文件了,这两行肯定都是false了System.out.println(file.isDirectory());}

在这里插入图片描述
但是我们可以先创建这个文件
在这里插入图片描述
文件跟目录的区别可以认为是文件是这个路径的重点,而目录下面还有别的路径
在这里插入图片描述

删除文件

public static void main(String[] args) {File file=new File("./test.txt");file.delete();}

在这里插入图片描述

public static void main(String[] args) throws InterruptedException {File file=new File("./test.txt");//不是立刻删除,等到程序运行结束再删除file.deleteOnExit();Thread.sleep(2000);//程序运行两秒会结束,所以这个文件在两秒之后删除}

在这里插入图片描述

创建目录

单层目录

public static void main(String[] args) {File file = new File("./testDir");// mk => make    dir => directory// mkdir 一次只能创建一层目录.  mkdirs 可以一次创建多级目录file.mkdir();//file.mkdirs();}

在这里插入图片描述
多层目录

    public static void main(String[] args) {File file = new File("./testDir/111/222");// mk => make    dir => directory// mkdir 一次只能创建一层目录.  mkdirs 可以一次创建多级目录//file.mkdir();file.mkdirs();}

在这里插入图片描述

文件重命名

public static void main(String[] args) {File file = new File("./test.txt");File file2 = new File("./src/test.txt");//本来test.txt跟src是同级别的,现在把test.txt移动到src目录下面了
//因此文件重命名也可以做到移动文件的效果file.renameTo(file2);}

针对文件内容操作

Reader

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.io.Reader;// Reader 使用.
public class Demo6
{public static void main(String[] args) throws IOException{// FileReader 构造方法, 可以填写一个文件路径(绝对路径/相对路径都行), 也可以填写一个构造好的 File 对象
//        Reader reader = new FileReader("d:/test.txt");
//        try {
//            // 中间的代码无论出现啥情况, close 都能保证执行到.
//        } finally {
//            // 抛出异常, 或者 return, close 就都执行不到了~~
//            reader.close();
//        }// 上述使用 finally 的方式能解决问题, 但是不优雅.// 使用 try with resources 是更好的解决方案.try (Reader reader = new FileReader("d:/test.txt")){while (true){char buf[] = new char[1024];int n = reader.read(buf);//读到的有效字符的个数if (n == -1){// 读到文件末尾了.break;}//实际只读了n个字符,小于n就行了for (int i = 0; i < n; i++){System.out.print(buf[i] + ",");}}}}
}

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
文件泄露相当于打开很多文件,使用完之后都不关闭,文件描述符表就满了,再打开新的文件,文件描述符就装不下了,这些文件就不知道上哪里去了,就造成了文件泄露
在这里插入图片描述

InputStream

在这里插入图片描述

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;public class Demo7 {public static void main(String[] args) throws IOException {try (InputStream inputStream = new FileInputStream("d:/test.txt")) {while (true) {byte[] buf = new byte[1024];int n = inputStream.read(buf);if (n == -1) {break;}for (int i = 0; i < n; i++) {System.out.printf("%x ", buf[i]);}String s = new String(buf, 0, n, "utf8");//把buf数组的从0到n下标在string的构造方法中,通过utf8的编码转换,转换成人能看懂的字符串System.out.println(s);}}}
}

在这里插入图片描述
于是我们可以借助Scanner来完成上述操作
平时我们输入是
Scanner scanner=new Scanner(System.in);

那么system.in的类型也是一个InputStream
在这里插入图片描述
在这里插入图片描述
于是我们就可以

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
import java.util.Scanner;public class Demo8 {public static void main(String[] args) throws IOException {try (InputStream inputStream = new FileInputStream("d:/test.txt")) {Scanner scanner = new Scanner(inputStream);// 此时就是从 test.txt 这个文件中读取数据了!!String s = scanner.next();System.out.println(s);}}
}

在这里插入图片描述

write

在这里插入图片描述

import java.io.FileWriter;
import java.io.IOException;
import java.io.Writer;public class Demo9 
{public static void main(String[] args) throws IOException {try (Writer writer = new FileWriter("d:/test.txt", true)) {// write 是可以一次直接写一个字符串. 这个是非常方便的.writer.write("hello java");}}
}

在这里插入图片描述

经典面试题

1.扫描指定目录,并找到名称中包含指定字符的所有普通文件(不包含目录),并且后续询问用户是否要删除该文件

import java.io.File;
import java.util.Scanner;public class Demo10 {private static Scanner scanner = new Scanner(System.in);public static void main(String[] args) {// 1. 让用户输入一个目录. 后续的查找都是针对这个目录来进行的.System.out.println("请输入要搜索的根目录: ");File rootPath = new File(scanner.next());// 2. 再让用户输入要搜索/要删除的关键词.System.out.println("请输入要删除的关键词: ");String word = scanner.next();// 3. 判定一下当前输入的目录是否有效.if (!rootPath.isDirectory()) {System.out.println("您此时输入的路径不是合法目录!");return;}// 4. 遍历目录. 从根目录出发, 按照 深度优先(递归) 的方式, 进行遍历scanDir(rootPath, word);}public static void scanDir(File currentDir, String word) {// 1. 先列出当前目录中都包含哪些内容.File[] files = currentDir.listFiles();if (files == null || files.length == 0) {// 空的目录或者非法的目录return;}// 2. 遍历列出的文件, 分两个情况分别讨论.for (File f : files) {// 加个日志, 方便看程序执行的过程.System.out.println(f.getAbsolutePath());if (f.isFile()) {// 3. 如果当前文件是普通文件, 看看文件名是否包含了 word, 来决定是否要删除.dealFile(f, word);} else {// 4. 如果当前文件是目录文件, 就递归执行 scanDirscanDir(f, word);}}}private static void dealFile(File f, String word) {// 1. 先判定当前文件名是否包含 wordif (!f.getName().contains(word)) {// 此时这个文件不包含 word 关键词. 直接跳过.return;}// 2. 包含 word 就需要询问用户是否要删除该文件?System.out.println("该文件是: " + f.getAbsolutePath() + ", 是否要确认删除? (Y/N)");String choice = scanner.next();if (choice.equals("Y") || choice.equals("y")) {f.delete();}// 如果是其他值, 都忽略.}
}

2.进行普通文件的复制

在这里插入图片描述

import java.io.*;
import java.util.Scanner;// 完成文件复制.
public class Demo11 {public static void main(String[] args) throws IOException {Scanner scanner = new Scanner(System.in);// 1. 输入路径并且合法性判定System.out.println("请输入要复制的源文件路径: ");String src = scanner.next();File srcFile = new File(src);if (!srcFile.isFile()) {System.out.println("您输入的源文件路径非法!");return;}System.out.println("请输入要复制到的目标路径: ");String dest = scanner.next();File destFile = new File(dest);// 不要求目标文件本身存在. 但是得保证目标文件所在的目录, 得是存在的.// 假设目标文件写作 d:/tmp/cat2.jpg, 就需要保证 d:/tmp 目录是存在的.if (!destFile.getParentFile().isDirectory()) {System.out.println("您输入的目标文件路径非法!");return;}// 2. 进行复制操作的过程. 按照字节流打开.try (InputStream inputStream = new FileInputStream(srcFile);OutputStream outputStream = new FileOutputStream(destFile)) {while (true) {byte[] buffer = new byte[20480];int n = inputStream.read(buffer);System.out.println("n = " + n);if (n == -1) {System.out.println("读取到 eof, 循环结束. ");break;}outputStream.write(buffer, 0, n);}}}
}

相关文章:

文件操作/IO

文件 文件是一种在硬盘上存储数据的方式&#xff0c;操作系统帮我们把硬盘的一些细节都封装起来了&#xff0c;程序员只需要了解文件相关的接口即可&#xff0c;相当于操作文件就是间接的操作硬盘了 硬盘用来存储数据&#xff0c;和内存相比硬盘的存储空间更大&#xff0c;访问…...

基于Java+SpringBoot+vue前后端分离共享汽车管理系统设计实现

博主介绍&#xff1a;✌全网粉丝30W,csdn特邀作者、博客专家、CSDN新星计划导师、Java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精彩专…...

Mac RN环境搭建

RN ios android原生环境搭建有时候是真恶心&#xff0c;电脑环境不一样配置也有差异。 我已经安装官网的文档配置了ios环境 执行 npx react-nativelatest init AwesomeProject 报错 然后自己百度查呀执行 gem update --system 说是没有权限&#xff0c;执行失败。因为Mac…...

log4j教程_编程入门自学教程_菜鸟教程-免费教程分享

教程简介 Log4j是Apache的一个开源项目&#xff0c;通过使用Log4j&#xff0c;我们可以控制日志信息输送的目的地是控制台、文件、GUI组件&#xff0c;甚至是套接口服务器、NT的事件记录器、UNIX Syslog守护进程等&#xff1b;我们也可以控制每一条日志的输出格式&#xff1b;…...

DP——背包问题

DP——背包问题 01背包问题分数背包问题多重背包问题完全背包问题 当我们谈论背包问题时&#xff0c;可以想象成一个小朋友要去旅行&#xff0c;但是他只能带一个容量有限的背包。他有一些物品可以选择放入背包&#xff0c;每个物品都有自己的重量和价值。小朋友的目标是在不超…...

【从零学习python 】29. 「函数参数详解」——了解Python函数参数的不同用法

文章目录 函数参数详解一、缺省参数二、不定长参数三、缺省参数在*args后面可变、不可变类型总结 进阶案例 函数参数详解 一、缺省参数 调用函数时&#xff0c;缺省参数的值如果没有传入&#xff0c;则取默认值。 下例会打印默认的age&#xff0c;如果age没有被传入&#xf…...

10个经典战略分析模型,助力洞察市场明确优势

在企业的经营管理过程中&#xff0c;要时刻清晰内外部环境和自身的优劣势&#xff0c;做好企业略规划&#xff0c;进行企业内外部资源的分析&#xff0c;对经营环境&#xff0c;企业核心竞争力有足够的判断&#xff0c;才能明确企业的发展方向。本文为大家分享10个常用的战略分…...

C++(Qt)软件调试---将调试工具安装到AeDebug(11)

C(Qt)软件调试—将调试工具安装到AeDebug&#xff08;11&#xff09; 文章目录 C(Qt)软件调试---将调试工具安装到AeDebug&#xff08;11&#xff09;1、前言1.1 使用的调试工具 2、调试器安装1.1 WinDbg1.2 procdump1.3 DrMinGW1.4 vsjitdebugger 更多精彩内容&#x1f449;个…...

浅谈限流式保护器在住宅电气防火的应用

安科瑞 华楠 【摘要】随着人民生活水平的提高&#xff0c;家用大功率电器普遍被使用&#xff0c;导致用电量剧增&#xff0c;电气火灾频发。文章分析了电气火灾发生的原因&#xff0c;并时电气火灾的防范措施进行了探讨。 【关键词】电气火灾&#xff1b;原因&#xff1b;防范…...

ChatGPT助力ModStartBlog,博客写作更智能

ModStartBlog v7.1.0&#xff0c;ChatGPT 支持、界面全新优化 在数字化时代&#xff0c;博客已经成为人们分享知识、表达观点和建立个人品牌的重要工具。ModStartBlog是一款流行的博客平台&#xff0c;其最新的版本v7.1.0不仅增加了ChatGPT支持&#xff0c;还对界面进行了全新…...

Jpa与Druid线程池及Spring Boot整合(二): spring-boot-starter-data-jpa 踏坑异常处理方案

Jpa与Druid线程池及Spring Boot整合(一) Jpa与Druid线程池及Spring Boot整合(二)&#xff1a;几个坑 附录官网文档&#xff1a;core.domain-events域事件 从聚合根发布事件 存储库管理的实体是聚合根。在领域驱动设计应用程序中&#xff0c;这些聚合根通常会发布领域事件。Sp…...

Vue3组件库

Vue组件库 ViteVue3TypescriptTSX 1、项目搭建 1.1、创建项目&#xff08;yarn&#xff09; D:\WebstromProject>yarn create vite yarn create v1.22.19 [1/4] Resolving packages... [2/4] Fetching packages... [3/4] Linking dependencies... [4/4] Building fresh pa…...

AUTOSAR从入门到精通-【应用篇】基于 CAN/LIN 总线的智能配电监控系统的研究设计

目录 前言 国内外研究现状 CAN 总线和 LIN 总线技术 2.1CAN 总线技术 2.1.1 通信模型...

数据安全服务能力评定资格证书-申请流程

数据安全服务能力评定&#xff08;以下简称能力评定&#xff09;是指对数据安全服务提供商从事数据安全服务综合能力的评定&#xff0c;包括技术能力、服务能力、质量保证能力、人员构成与素质、经营业绩、资产状况等要素。 用于对中华人民共和国境内的数据安全服务提供商提供…...

用js快速生成一个简单的css原子库 例如: .mr-18 .pl-18

第三方css原子库的缺点 比如 tailwindcss&#xff0c;有学习成本最开始写的时候效率可能还没有我们自己手写效率高&#xff0c;需要配置&#xff0c;会有原始样式被覆盖的问题&#xff1b;总之就是一个字重 自己搓的优点 学习成本低灵活不会有副作用 <!DOCTYPE html>…...

Java鹰眼轨迹服务 轻骑小程序 运动健康与社交案例

Java地图专题课 基本API BMapGLLib 地图找房案例 MongoDB 百度地图鹰眼轨迹服务 鹰眼轨迹服务概述 鹰眼是一套轨迹管理服务&#xff0c;提供各端SDK和API供开发者便捷接入&#xff0c;追踪所管理的车辆/人员等运动物体。 基于鹰眼提供的接口和云端服务&#xff0c;开发者可以迅…...

【产品经理】微信小程序隐私保护指引

为了分辨用户&#xff0c;开发者将在获取你的明示同意后&#xff0c;收集你的微信昵称、头像。 为了显示距离&#xff0c;开发者将在获取你的明示同意后&#xff0c;收集你的位置信息。 开发者收集你的地址&#xff0c;用于获取位置信息。 开发者收集你的发票信息&#xff0…...

springboot创建websocket服务端

springboot创建websocket服务端 1.配置类 package com.neusoft.airport.websocket;import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.web.socket.server.standard.ServerEndp…...

网络安全攻防实战:探索互联网发展史

大家好&#xff0c;我是沐尘而生。 互联网发展史&#xff1a;数字世界的壮阔画卷 从早期的ARPANET到今天的万物互联&#xff0c;互联网经历了漫长的发展过程。然而&#xff0c;随着技术的进步&#xff0c;网络安全问题也随之而来。我们不仅要探索互联网的壮阔历程&#xff0c;…...

pwm接喇叭搞整点报时[keyestudio的8002模块]

虽然现在查看时间很方便&#xff0c;但是其实好像我的时间观念却越来越差。于是决定搞一个整点报时&#xff0c;时常提醒自己时光飞逝&#xff0c;不要老是瞎墨迹。 这篇主要讲一下拼装方式和配置&#xff0c;就差不多了。不涉及什么代码。3针的元器件&#xff0c;去掉正负接线…...

接口测试中缓存处理策略

在接口测试中&#xff0c;缓存处理策略是一个关键环节&#xff0c;直接影响测试结果的准确性和可靠性。合理的缓存处理策略能够确保测试环境的一致性&#xff0c;避免因缓存数据导致的测试偏差。以下是接口测试中常见的缓存处理策略及其详细说明&#xff1a; 一、缓存处理的核…...

Vue3 + Element Plus + TypeScript中el-transfer穿梭框组件使用详解及示例

使用详解 Element Plus 的 el-transfer 组件是一个强大的穿梭框组件&#xff0c;常用于在两个集合之间进行数据转移&#xff0c;如权限分配、数据选择等场景。下面我将详细介绍其用法并提供一个完整示例。 核心特性与用法 基本属性 v-model&#xff1a;绑定右侧列表的值&…...

连锁超市冷库节能解决方案:如何实现超市降本增效

在连锁超市冷库运营中&#xff0c;高能耗、设备损耗快、人工管理低效等问题长期困扰企业。御控冷库节能解决方案通过智能控制化霜、按需化霜、实时监控、故障诊断、自动预警、远程控制开关六大核心技术&#xff0c;实现年省电费15%-60%&#xff0c;且不改动原有装备、安装快捷、…...

[ICLR 2022]How Much Can CLIP Benefit Vision-and-Language Tasks?

论文网址&#xff1a;pdf 英文是纯手打的&#xff01;论文原文的summarizing and paraphrasing。可能会出现难以避免的拼写错误和语法错误&#xff0c;若有发现欢迎评论指正&#xff01;文章偏向于笔记&#xff0c;谨慎食用 目录 1. 心得 2. 论文逐段精读 2.1. Abstract 2…...

第25节 Node.js 断言测试

Node.js的assert模块主要用于编写程序的单元测试时使用&#xff0c;通过断言可以提早发现和排查出错误。 稳定性: 5 - 锁定 这个模块可用于应用的单元测试&#xff0c;通过 require(assert) 可以使用这个模块。 assert.fail(actual, expected, message, operator) 使用参数…...

论文浅尝 | 基于判别指令微调生成式大语言模型的知识图谱补全方法(ISWC2024)

笔记整理&#xff1a;刘治强&#xff0c;浙江大学硕士生&#xff0c;研究方向为知识图谱表示学习&#xff0c;大语言模型 论文链接&#xff1a;http://arxiv.org/abs/2407.16127 发表会议&#xff1a;ISWC 2024 1. 动机 传统的知识图谱补全&#xff08;KGC&#xff09;模型通过…...

MySQL中【正则表达式】用法

MySQL 中正则表达式通过 REGEXP 或 RLIKE 操作符实现&#xff08;两者等价&#xff09;&#xff0c;用于在 WHERE 子句中进行复杂的字符串模式匹配。以下是核心用法和示例&#xff1a; 一、基础语法 SELECT column_name FROM table_name WHERE column_name REGEXP pattern; …...

Redis的发布订阅模式与专业的 MQ(如 Kafka, RabbitMQ)相比,优缺点是什么?适用于哪些场景?

Redis 的发布订阅&#xff08;Pub/Sub&#xff09;模式与专业的 MQ&#xff08;Message Queue&#xff09;如 Kafka、RabbitMQ 进行比较&#xff0c;核心的权衡点在于&#xff1a;简单与速度 vs. 可靠与功能。 下面我们详细展开对比。 Redis Pub/Sub 的核心特点 它是一个发后…...

Kafka入门-生产者

生产者 生产者发送流程&#xff1a; 延迟时间为0ms时&#xff0c;也就意味着每当有数据就会直接发送 异步发送API 异步发送和同步发送的不同在于&#xff1a;异步发送不需要等待结果&#xff0c;同步发送必须等待结果才能进行下一步发送。 普通异步发送 首先导入所需的k…...

Vite中定义@软链接

在webpack中可以直接通过符号表示src路径&#xff0c;但是vite中默认不可以。 如何实现&#xff1a; vite中提供了resolve.alias&#xff1a;通过别名在指向一个具体的路径 在vite.config.js中 import { join } from pathexport default defineConfig({plugins: [vue()],//…...