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

news2024/11/18 16:33:12

目录

  • 一、文件的基本知识
    • 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());
    }
}

代码的运行结果如下:

在这里插入图片描述

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

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1900221.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

电脑刚删除的文件怎么恢复?可使用这几种恢复方法!

在日常生活和工作中,我们时常会在电脑上进行各种文件操作,包括删除不需要的文件。然而,有时候我们可能会误删一些重要的文件,或者在删除后立刻意识到这些文件的重要性。 那么,电脑刚删除的东西怎么恢复呢?本…

Spark快速大数据分析PDF下载读书分享推荐

《Spark 快速大数据分析》是一本为 Spark 初学者准备的书,它没有过多深入实现细节,而是更多关注上层用户的具体用法。不过,本书绝不仅仅限于 Spark 的用法,它对 Spark 的核心概念和基本原理也有较为全面的介绍,让读者能…

多功能实用工具箱,实用工具箱提供了从日常,图片,查询、设备、特色、提取等多方面的功能,操作简单,即点即用,避免您下载超多应用的难题,应用体积轻巧,界面简洁。

今天给大家分享手机工具软件合集,明天想看什么软件,在评论区留言吧! 软件链接:4款万能玩机工具,一网打尽,快来看看! 实用工具箱 这是一款多功能实用工具箱,实用工具箱提供了从日常…

【深度学习】图形模型基础(5):线性回归模型第三部分:线性回归模型拟合

1.引言 本博文专辑的焦点主要集中在回归模型的实用案例和工具上,从简单的单变量线性回归入手,逐步过渡到包含多个预测变量、非线性模型,以及在预测和因果推断中的应用。本文我们将介绍回归模型推断的一些数学结构,并提供一些代数…

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

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

Rust变量绑定

变量绑定 Rust 通过静态类型确保类型安全。变量绑定可以在声明时说明类型,不过在多数情况下,编译器能够从上下文推导出变量的类型,从而大大减少了类型说明的工作。 使用 let 绑定操作可以将值(比如字面量)绑定&#…

【Nginx】docker运行Nginx及配置

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

分库分表真的适合你的系统吗?

曾几何时,“并发高就分库,数据大就分表”已经成了处理 MySQL 数据增长问题的圣经。 面试官喜欢问,博主喜欢写,候选人也喜欢背,似乎已经形成了一个闭环。 但你有没有思考过,分库分表真的适合你的系统吗&am…

c++ word转换为pdf

在windows系统下,使用QAxObject效果是最好的 转60多兆的文件速度还是可以的,不建议使用多线程,因为多线程会多次调用转换函数,导致程序一直运行,只有全部转换完成后,程序才能继续向下运行,但是c…

【Unity数据存储】Unity中使用SqLite数据库进行数据持久化

👨‍💻个人主页:元宇宙-秩沅 👨‍💻 hallo 欢迎 点赞👍 收藏⭐ 留言📝 加关注✅! 👨‍💻 本文由 秩沅 原创 👨‍💻 专栏交流🧧&…

驱动新质生产力发展:绿色算力有了科学评价标准

在席卷全球的人工智能大潮中,人工智能技术与实体经济的融合,不仅是驱动新质生产力发展的引擎,而且正在以磅礴之势推动千行百业的数字化转型。 而作为人工智能的关键要素,绿色算力在引领科技进步、带动产业升级、培育新质生产力中发…

基于Oauth2.0的OpenFeign远程调用

目录 前言 1.引入openfeign相关依赖 2.开启openFeign远程调用,在启动类头加上注解即可 3. 提供远程调用接口,接口名称必须与controler名称保持一致 4.远程调用关键代码 4.1 注入restTemplate 4.2 配置拦截器 4.3 设置请求头 4.4 获取请求结果 4.5 远…

鸿蒙笔记导航栏,路由,还有axios

1.导航组件 导航栏位置可以调整,导航栏位置 Entry Component struct t1 {build() {Tabs(){TabContent() {Text(qwer)}.tabBar("首页")TabContent() {Text(发现内容)}.tabBar(发现)TabContent() {Text(我的内容)}.tabBar("我的")}// 做平板适配…

“郭有才”商标主要类别都已被注册!

前阵山东网红“郭有才”火遍大江北,当然少不了许多想去申请注册“郭有才”商标名称的,普推商标知产老杨检索,发现“郭有才”商标申请了43个类别,基本上类别都被申请注册,已注册的商标大多是在“郭有才”火之前申请注册…

Qt 基础组件速学 鼠标和键盘事件

学习目标: 鼠标事件和键盘事件应用 前置环境 运行环境:qt creator 4.12 学习内容和效果演示: 1.鼠标事件 根据鼠标的坐标位置,做出对应的事件。 2.键盘事件 根据键盘的输入做出对应操作 详细主要代码 1.鼠标事件 #include "main…

#商铺出租数据#2024年6月北上广深成渝对比情况

#商铺出租数据#2024年6月北上广深成渝对比情况: 根据某8平台不完全样本统计,北上广深成渝商铺每平米月租金从高到低依次为 北京218.7元、上海212.1元、深圳159.3元、广州145.8元、成都138.6元、重庆104.1元。 地区 区县 日期 类型 数值 上海 全城 202…

开发必备基础知识【字符编码合集】

开发必备基础知识【字符编码合集】 大家在日常开发交流中会发现,别人那里运行的好好的文件,在你电脑上却无法编译,甚至出现一堆莫名其妙的字符,比如:��� 程序中经常遇到一些关于乱码…

开发笔记:vue3+ts+vant 卡片数据分页,下拉加载,卡片左滑可删除

效果: 实现 使用vantui组件 van-swipe-cell van-card (商品卡片) 核心代码 const currentPage ref(1) const pageSize ref(4) const totalSize ref(10) const loading ref(false) const finished ref(false) const refreshing ref(…

商务办公优选!AOC Q27E3S2商用显示器,打造卓越新体验!

摘要:助办公室一族纵横职场,实现高效舒适办公! 在日常商务办公中,对于办公室一族来说总有太多“难难难难难点”:工作任务繁琐,熬夜加班心力交瘁、长时间伏案工作导致颈椎、眼睛等出现问题,职业…

SQL Server 2022数据库对象

《SQL Server 2022从入门到精通(视频教学超值版)》图书介绍-CSDN博客 数据库对象是数据库的组成部分,数据表、视图、索引、存储过程以及触发器等都是数据库对象。 (1)数据库的主要对象是数据表,数据表是一…