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

【JavaEE精炼宝库】文件操作(1)——基本知识 | 操作文件——打开实用性编程的大门

目录

  • 一、文件的基本知识
    • 1.1 文件的基本概念:
    • 1.2 树型结构组织和目录:
    • 1.3 文件路径(Path):
    • 1.4 二进制文件 VS 文本文件:
    • 1.5 其它:
  • 二、Java 操作文件
    • 2.1 方法说明:
    • 2.2 使用演示:

一、文件的基本知识

1.1 文件的基本概念:

我们先来认识狭义上的文件(file)。针对硬盘这种持久化存储的 I/O 设备,当我们想要进行数据保存时,往往不是保存成一个整体,而是独立成一个个的单位进行保存,这个独立的单位就被抽象成文件的概念,就类似办公桌上的⼀份份真实的文件一般。

在这里插入图片描述

文件除了有数据内容之外,还有一部分信息,例如文件名、文件类型、文件大小等并不作为文件的数据而在,我们把这部分信息可以视为文件的元信息。
在这里插入图片描述

1.2 树型结构组织和目录:

同时,随着文件越来越多,对文件的系统管理也被提上了日程,如何进行文件的组织呢,一种合乎自然的想法出现了,就是按照层级结构进行组织,也就是我们数据结构中学习过的树形结构。这样,一种专门用来存放管理信息的特殊文件诞生了,也就是我们平时所谓文件夹(folder)或者目录(directory)的概念。
在这里插入图片描述

1.3 文件路径(Path):

如何在文件系统中如何定位我们的⼀个唯一的文件就成为当前要解决的问题,但这难不倒计算机科学家,因为从树型结构的角度来看,树中的每个结点都可以被一条从根开始,一直到达结点的路径所描述,而这种描述方式就被称为文件的绝对路径(absolute path)。

在 windows 上以盘符为开头的路径称为 “绝对路径”。

在这里插入图片描述

除了可以从根开始进行路径的描述,我们可以从任意结点出发,进行路径的描述,而这种描述方式就被称为相对路径(relative
path),相对于当前所在结点的一条路径。

在这里插入图片描述

注意:目录和目录之间,使用 /(正斜杠) 或者 \(反斜杠) 进行分隔,但是这个事情只是局限在 windows 上。而 Linux ,Mac,IOS,Android 都是按照 / 来进行表示的(不支持 \ 的方式)。因此在日常开发中,推荐大家使用 / 而不是 \ 。这样写还有一个好处: \ 在字符串常量中,就会涉及到转义字符的概念,这样 \ 两个才能表示一个 \ ,这样太麻烦了。

给大家举个打开 QQ 的栗子:

绝对路径:D:/program/qq.exe

相对路径:./qq.exe

在相对路径中 ’ . ',表示当前所在的位置。如果需要返回上一级目录可以通过 …/ 来进行返回。

1.4 二进制文件 VS 文本文件:

即使是普通文件,根据其保存数据的不同,也经常被分为不同的类型,我们一般简单的划分为文本文件和二进制文件,分别指代保存被字符集编码的文本和按照标准格式保存的非被字符集编码过的文件。

如何区分二进制文件和文本文件呢?

一个简单粗暴的有效方法:使用记事本打开看看,如果不是乱码就是文本文件,如果是乱码,就是二进制文件。(文本文件是给人看的,二进制文件是给程序看的)

下图就是一个二进制文件用记事本打开的情况(乱码)。

在这里插入图片描述

1.5 其它:

  • Windows 操作系统上,会按照文件名中的后缀来确定文件类型以及该类型文件的默认打开程序。但这个习俗并不是通用的,在 OSX、Unix、Linux 等操作系统上,就没有这样的习惯,一般不对文件类型做如此精确地分类。
    在这里插入图片描述
  • 文件由于被操作系统进行了管理,所以根据不同的用户,会赋予用户不同的对待该文件的权限,⼀般地可以认为有可读、可写、可执行权限。 在这里插入图片描述
  • Windows 操作系统上,还有一类文件比较特殊,就是平时我们看到的快捷方式(shortcut),这种文件只是对真实文件的一种引用而已。其他操作系统上也有类似的概念,例如,软链接(softlink)等。

在这里插入图片描述

最后,很多操作系统为了实现接口的统一性,将所有的 I/O 设备都抽象成了文件的概念,使用这一理念最为知名的就是 Unix、Linux 操作系统万物皆文件。

二、Java 操作文件

在本节内容中,我们主要涉及文件的元信息、路径的操作,暂时不涉及关于文件中内容的读写操作。这里主要涉及到的类为 File 类。

2.1 方法说明:

  • 属性:
修饰符及类型属性说明
static StringpathSeparator依赖于系统的路径分隔符,String 类型的表示。
static charpathSeparator依赖于系统的路径分隔符,char类型的表示。

Java 为了能够跨平台,专门提供的变量(如果是 windows 版本的 JDK 就是 \,如果是 Linux / mac 版本的就是 /)。但是其实这个东西没啥用,我们统一使用 / 即可支持不同系统。

  • 构造方法:
方法名说明
File(File parent,String child)根据父目录 + 孩子文件路径,创建一个新的 File 实例。
File(String pathname)根据文件路径创建⼀个新的 File 实例,路径可以是绝对路径或者相对路径。
File(String parent, String child)根据父目录 + 孩子文件路径,创建⼀个新的 File 实例,父目录用路径表示。

我们最常使用的是第二个构造方法,字符串类型的路径,绝对路径 / 相对路径都是可以的。注意:相对路径,如果没有特定设置(在 idea 上可以设置),默认是从 Java 文件所在位置开始。

  • 普通方法:
返回值方法名说明
StringgetParent()返回 File 对象的父目录文件路径。
StringgetName()返回 FIle 对象的纯文件名称。
StringgetPath()返回 File 对象的文件路径。
StringgetAbsolutePath()返回 File 对象的绝对路径。
StringgetCanonicalPath()返回 File 对象的修饰过的绝对路径。
booleanexists()判断 File 对象描述的文件是否真实存在。
booleanisDirectory()判断 File 对象代表的文件是否是⼀个目录。
booleanisFile()判断 File 对象代表的文件是否是⼀个普通文件。
booleancreateNewFile()根据 File 对象,自动创建⼀个空文件。成功创建后返回 true。
booleandelete()根据 File 对象,删除该文件。成功删除后返回 true。
voiddeleteOnExit()根据 File 对象,标注文件将被删除,删除动作会到 JVM 运行结束时才会进行。
String[]list()返回 File 对象代表的目录下的所有文件名。
File[]listFiles()返回 File 对象代表的目录下的所有文件,以 File 对象表示。
booleanmkdir()创建 File 对象代表的目录。
booleanmkdirs()创建 File 对象代表的目录,如果必要,会创建中间目录。
booleanrenameTo(File dest)进行文件改名,也可以视为我们平时的剪切、粘贴操作。
booleancanRead()判断用户是否对文件有可读权限。
booleancanWrite()判断用户是否对文件有可写权限。

如上就是我们 File 类的一些常用方法,虽然很多,但是基本都要掌握😭。

2.2 使用演示:

  • 示例1:观察 get 系列的特点和差异。

代码如下:

import java.io.*;
public class boke1 {public static void main(String[] args) throws IOException {File file = new File("./text.txt");System.out.println(file.getParent());System.out.println(file.getName());System.out.println(file.getPath());System.out.println(file.getAbsolutePath());System.out.println(file.getCanonicalPath());}
}

示例运行结果为:

这里主要看 getAbsolutePath 和 getCanonicalPath 的区别。区别在于 getCanonicalPath
会对不必要的符号进行删除。

在这里插入图片描述

  • 示例2:普通文件的创建、删除。

代码如下:

import java.io.File;
import java.io.IOException;
public class demo2 {public static void main(String[] args) throws IOException {File file = new File("text.txt"); //刚开始文件不存在//判断文件 | 目录是否存在System.out.println(file.exists());System.out.println(file.isDirectory());System.out.println(file.isFile());System.out.println("---------------------------");//创建文件System.out.println(file.createNewFile());System.out.println("---------------------------");//判断文件 | 目录是否存在System.out.println(file.exists());System.out.println(file.isDirectory());System.out.println(file.isFile());System.out.println("---------------------------");//判断在文件已经存在的情况下,是否能够创建成功。System.out.println(file.createNewFile());System.out.println("---------------------------");//进行文件删除System.out.println(file.delete());System.out.println("---------------------------");//判断文件 | 目录是否存在System.out.println(file.exists());System.out.println(file.isDirectory());System.out.println(file.isFile());System.out.println("---------------------------");}
}

示例演示效果如下:
在这里插入图片描述

  • 示例3:观察目录的创建。

删除和上面普通文件的删除是一样的,这里就不再赘述。

代码如下:

import java.io.File;
import java.io.IOException;
public class demo3 {public static void main(String[] args) throws IOException {File dir = new File("dir"); // 刚开始目录不存在System.out.println(dir.isDirectory());System.out.println(dir.isFile());System.out.println("------------------------");System.out.println(dir.mkdir());System.out.println("------------------------");System.out.println(dir.isDirectory());System.out.println(dir.isFile());}
}

示例演示效果如下:
在这里插入图片描述

创建普通文件或者创建目录在 IDEA 上我们都是看的见的。将我们上述的代码执行后,IDEA 页面会出现对应的文件或者目录(示例2,之所以没有是因为我们最后将其删除了)。如下图:

  • 示例4:多级目录的创建。

mkdir() 的时候,如果中间目录不存在,则无法创建成功。mkdirs() 可以解决这个问题。

代码如下:

import java.io.File;
import java.io.IOException;
public class demo4 {public static void main(String[] args) throws IOException {File dir = new File("parent/aaa/bbb/ccc");//这里的 parent 和 aaa bbb ccc 都不存在System.out.println(dir.isDirectory());System.out.println(dir.isFile());System.out.println("----------------------------");System.out.println(dir.mkdir());System.out.println("----------------------------");System.out.println(dir.mkdirs());System.out.println("----------------------------");System.out.println(dir.isDirectory());System.out.println(dir.isFile());}
}

示例演示如下:
在这里插入图片描述

IDEA 上对应的变化如下图:

在这里插入图片描述

  • 示例5:文件重命名

注意:renameTo 是剪切、粘贴不是复制、粘贴。

代码如下:

注意:要保证 file 是存在的,dest 是不存在的。下面这段代码才能正确运行。

import java.io.File;
import java.io.IOException;
public class demo5 {public static void main(String[] args) throws IOException {File file = new File("text.txt"); // 要求 some-file.txt 得存在File dest = new File("dest.txt"); // 要求 dest.txt 不存在System.out.println(file.exists());System.out.println(dest.exists());System.out.println("-------------------------");System.out.println(file.renameTo(dest));System.out.println("-------------------------");System.out.println(file.exists());System.out.println(dest.exists());}
}

代码的运行结果如下:

在这里插入图片描述

结语:
其实写博客不仅仅是为了教大家,同时这也有利于我巩固知识点,和做一个学习的总结,由于作者水平有限,对文章有任何问题还请指出,非常感谢。如果大家有所收获的话还请不要吝啬你们的点赞收藏和关注,这可以激励我写出更加优秀的文章。

在这里插入图片描述

相关文章:

【JavaEE精炼宝库】文件操作(1)——基本知识 | 操作文件——打开实用性编程的大门

目录 一、文件的基本知识1.1 文件的基本概念:1.2 树型结构组织和目录:1.3 文件路径(Path):1.4 二进制文件 VS 文本文件:1.5 其它: 二、Java 操作文件2.1 方法说明:2.2 使用演示&…...

常用排序算法_06_归并排序

1、基本思想 归并排序采用分治法 (Divide and Conquer) 的一个非常典型的应。归并排序的思想就是先递归分解数组,再合并数组。归并排序是一种稳定的排序方法。 将数组分解最小之后(数组中只有一个元素,数组有序);然后…...

14-8 小型语言模型的兴起

过去几年,我们看到人工智能能力呈爆炸式增长,其中很大一部分是由大型语言模型 (LLM) 的进步推动的。GPT-3 等模型包含 1750 亿个参数,已经展示了生成类似人类的文本、回答问题、总结文档等能力。然而,虽然 LLM 的能力令人印象深刻…...

【Linux】:进程创建与终止

朋友们、伙计们,我们又见面了,本期来给大家解读一下有关Linux程序地址空间的相关知识点,如果看完之后对你有一定的启发,那么请留下你的三连,祝大家心想事成! C 语 言 专 栏:C语言:从…...

横截面交易策略:概念与示例

数量技术宅团队在CSDN学院推出了量化投资系列课程 欢迎有兴趣系统学习量化投资的同学,点击下方链接报名: 量化投资速成营(入门课程) Python股票量化投资 Python期货量化投资 Python数字货币量化投资 C语言CTP期货交易系统开…...

4.2 投影

一、投影和投影矩阵 我们以下面两个问题开始,问题一是为了展示投影是很容易视觉化的,问题二是关于 “投影矩阵”(projection matrices)—— 对称矩阵且 P 2 P P^2P P2P。 b \boldsymbol b b 的投影是 P b P\boldsymbol b Pb。…...

23种设计模式之装饰者模式

深入理解装饰者模式 一、装饰者模式简介1.1 定义1.2 模式类型1.3 主要作用1.4 优点1.5 缺点 二、模式动机三、模式结构四、 装饰者模式的实现4.1 组件接口4.2 具体组件4.3 装饰者抽象类4.4 具体装饰者4.5 使用装饰者模式4.6 输出结果: 五、 应用场景5.1 图形用户界面…...

数据结构--单链表实现

欢迎光顾我的homepage 前言 链表和顺序表都是线性表的一种,但是顺序表在物理结构和逻辑结构上都是连续的,但链表在逻辑结构上是连续的,而在物理结构上不一定连续;来看以下图片来认识链表与顺序表的差别 这里以动态顺序表…...

2024攻防演练:亚信安全推出MSS/SaaS短期定制服务

随着2024年攻防演练周期延长的消息不断传出,各参与方将面临前所未有的挑战。面对强大的攻击队伍和日益严格的监管压力,防守单位必须提前进行全面而周密的准备和部署。为应对这一形势,亚信安全特别推出了为期三个月的MSS/SaaS短期订阅方案。该…...

基于java+springboot+vue实现的在线课程管理系统(文末源码+Lw)236

摘要 本文首先介绍了在线课程管理系统的现状及开发背景,然后论述了系统的设计目标、系统需求、总体设计方案以及系统的详细设计和实现,最后对在线课程管理系统进行了系统检测并提出了还需要改进的问题。本系统能够实现教师管理,科目管理&…...

每日一更 EFK日志分析系统

需要docker和docker-compose环境 下面时docker-compose.yaml文件 [rootnode1 docker-EFK]# cat docker-compose.yaml version: 3.3services:elasticsearch:image: "docker.elastic.co/elasticsearch/elasticsearch:7.17.5"container_name: elasticsearchrestart: …...

python类继承和类变量

Python一些类继承和实例变量的使用 定义基类 class APIException:code 500msg "Sorry, error"error_code 999def __init__(self, msgNone):print("APIException init ...")def error_400(self):pass复用基类的属性值 class ClientTypeError(APIExcept…...

js 随机生成整数

随机生成一个唯一的整数 id export const randomId () > { return Date.now() Math.floor(Math.random() * 10000) } 生成随机ID的方法 // 随机生成0 - 9999 export const randomId ()> { return Math.floor(Math.random() * 10000).toString() } // 随机生成0-999之…...

深入Django(七)

Django的数据库迁移系统 引言 在前六天的教程中,我们介绍了Django的基本概念、模型、视图、模板、URL路由和表单系统。今天,我们将讨论Django的数据库迁移系统,它是管理和跟踪数据库变化的关键组件。 Django数据库迁移概述 Django的数据库…...

【区分vue2和vue3下的element UI Steps 步骤条组件,分别详细介绍属性,事件,方法如何使用,并举例】

在 Vue 2 和 Vue 3 中,Element UI(针对 Vue 2)和 Element Plus(针对 Vue 3)提供了 Steps 步骤条组件,用于展示当前操作的进度步骤。虽然这两个库都提供了步骤条组件,但它们在属性、事件和方法的…...

uni-app x 跨平台开发框架

目录 uni-app x 是什么 和Flutter对比 uts语言 uvue渲染引擎 组合式API的写法 选项式API写法 页面生命周期 API pages.json全局配置文件 总结 uni-app x 是什么 uni-app x,是下一代 uni-app,是一个跨平台应用开发引擎。 uni-app x 是一个庞…...

YOLOv8模型调参---数据增强

目录 1.数据预处理 2.数据增强 2.1 数据增强的作用 2.2 数据增强方式与适用场景 2.2.1离线增强(Offline Augmentation) 2.2.2 在线增强(Online Augmentation) 3. 数据增强的具体方法 4. YOLOv8的数据增强 4.1 YOLOv8默认…...

【Nginx】docker运行Nginx及配置

Nginx镜像的获取 直接从Docker Hub拉取Nginx镜像通过Dockerfile构建Nginx镜像后拉取 二者区别 主要区别在于定制化程度和构建过程的控制: 直接拉取Nginx镜像: 简便性:直接使用docker pull nginx命令可以快速拉取官方的Nginx镜像。这个过程…...

tensorflow和numpy的版本

查看cuda版本 dpkg -l | grep cuda i libcudart11.0:amd64 11.5.117~11.5.1-1ubuntu1 amd64 NVIDIA CUDA Runtime Library ii nvidia-cuda-dev:amd64 11.5.1-1ubuntu1 …...

二维Gamma分布的激光点云去噪

目录 1、Gamma 分布简介2、实现步骤 1、Gamma 分布简介 Gamma 分布在合成孔径雷达( Synthetic Aperture Radar,SAR) 图像分割中具有广泛应用,较好的解决了SAR 图像中相干斑噪声对图像分割的影响。采用二维Gamma 分布对…...

超短脉冲激光自聚焦效应

前言与目录 强激光引起自聚焦效应机理 超短脉冲激光在脆性材料内部加工时引起的自聚焦效应,这是一种非线性光学现象,主要涉及光学克尔效应和材料的非线性光学特性。 自聚焦效应可以产生局部的强光场,对材料产生非线性响应,可能…...

从WWDC看苹果产品发展的规律

WWDC 是苹果公司一年一度面向全球开发者的盛会,其主题演讲展现了苹果在产品设计、技术路线、用户体验和生态系统构建上的核心理念与演进脉络。我们借助 ChatGPT Deep Research 工具,对过去十年 WWDC 主题演讲内容进行了系统化分析,形成了这份…...

生成 Git SSH 证书

🔑 1. ​​生成 SSH 密钥对​​ 在终端(Windows 使用 Git Bash,Mac/Linux 使用 Terminal)执行命令: ssh-keygen -t rsa -b 4096 -C "your_emailexample.com" ​​参数说明​​: -t rsa&#x…...

CMake 从 GitHub 下载第三方库并使用

有时我们希望直接使用 GitHub 上的开源库,而不想手动下载、编译和安装。 可以利用 CMake 提供的 FetchContent 模块来实现自动下载、构建和链接第三方库。 FetchContent 命令官方文档✅ 示例代码 我们将以 fmt 这个流行的格式化库为例,演示如何: 使用 FetchContent 从 GitH…...

3-11单元格区域边界定位(End属性)学习笔记

返回一个Range 对象,只读。该对象代表包含源区域的区域上端下端左端右端的最后一个单元格。等同于按键 End 向上键(End(xlUp))、End向下键(End(xlDown))、End向左键(End(xlToLeft)End向右键(End(xlToRight)) 注意:它移动的位置必须是相连的有内容的单元格…...

AspectJ 在 Android 中的完整使用指南

一、环境配置(Gradle 7.0 适配) 1. 项目级 build.gradle // 注意:沪江插件已停更,推荐官方兼容方案 buildscript {dependencies {classpath org.aspectj:aspectjtools:1.9.9.1 // AspectJ 工具} } 2. 模块级 build.gradle plu…...

管理学院权限管理系统开发总结

文章目录 🎓 管理学院权限管理系统开发总结 - 现代化Web应用实践之路📝 项目概述🏗️ 技术架构设计后端技术栈前端技术栈 💡 核心功能特性1. 用户管理模块2. 权限管理系统3. 统计报表功能4. 用户体验优化 🗄️ 数据库设…...

基于Java Swing的电子通讯录设计与实现:附系统托盘功能代码详解

JAVASQL电子通讯录带系统托盘 一、系统概述 本电子通讯录系统采用Java Swing开发桌面应用,结合SQLite数据库实现联系人管理功能,并集成系统托盘功能提升用户体验。系统支持联系人的增删改查、分组管理、搜索过滤等功能,同时可以最小化到系统…...

JavaScript基础-API 和 Web API

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

Leetcode33( 搜索旋转排序数组)

题目表述 整数数组 nums 按升序排列&#xff0c;数组中的值 互不相同 。 在传递给函数之前&#xff0c;nums 在预先未知的某个下标 k&#xff08;0 < k < nums.length&#xff09;上进行了 旋转&#xff0c;使数组变为 [nums[k], nums[k1], …, nums[n-1], nums[0], nu…...