【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());
    }
}

代码的运行结果如下:

在这里插入图片描述

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

在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

第十五章 Nest Pipe(内置及自定义)

NestJS的Pipe是一个用于数据转换和验证的特殊装饰器。Pipe可以应用于控制器(Controller)的处理方法(Handler)和中间件(Middleware),用于处理传入的数据。它可以用来转换和验证数据,确…

软通动力子公司鸿湖万联最新成果SwanLink AI亮相世界人工智能大会

7月4日,2024世界人工智能大会暨人工智能全球治理高级别会议(WAIC 2024)在上海拉开帷幕,软通动力董事长兼首席执行官刘天文受邀出席开幕式。其间,软通动力携子公司鸿湖万联深度参与到大会各项活动中,并全面展…

制作Ai 数字人和数字人带货全面拆解复盘

看了后不用再花高价钱去买怎么制作数字人 .数字人带货的相关教程了 市面上基本都是通过这几个方法制作的数字人 超级详细 值得注意的是 拆解的太详细 仅供正规个人用途哦 请勿用于任何非法操作 否则 就不用接着往下看了 点击获取完整版资料

基于图像处理的滑块验证码匹配技术

滑块验证码是一种常见的验证码形式,通过拖动滑块与背景图像中的缺口进行匹配,验证用户是否为真人。本文将详细介绍基于图像处理的滑块验证码匹配技术,并提供优化代码以提高滑块位置偏移量的准确度,尤其是在背景图滑块阴影较浅的情…

R语言fastshap包进行支持向量机shap可视化分析

1995年VAPINK 等人在统计学习理论的基础上提出了一种模式识别的新方法—支持向量机 。它根据有限的样本信息在模型的复杂性和学习能力之间寻求一种最佳折衷。 以期获得最好的泛化能力.支持向量机的理论基础决定了它最终求得的是全局最优值而不是局部极小值,从而也保证了它对未知…

在AvaotaA1全志T527开发板上使用AvaotaOS 部署 Docker 服务

Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的镜像中,然后发布到任何流行的 Linux或Windows操作系统的机器上,也可以实现虚拟化。容器是完全使用沙箱机制,相互之间不会有任何接口。 准备…

Maven 分模块设计与开发 继承

介绍 在 Maven 中进行分模块设计(multi-module project),可以帮助将一个大型项目分解为更小、更易管理的模块。这种设计方式有助于提高项目的可维护性、复用性和团队协作效率。 继承关系 目录结构 引入父Maven 父坐标 在子项目中引入父亲…

雷电模拟器报错remount of the / superblock failed: Permission denied remount failed

报错截图 解决方法 打开设置 设置配置system.vmdk可写入 解决

【Nginx】docker运行Nginx及配置

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

可变参数 Collections 不可变集合 Stream流

目录 1.可变参数: 2.Collections: 3.不可变集合: 4.Stream流: 1、什么是流 2、如何生成流 1.单列集合获取Stream流 2.双列集合获取Stream流 3.数组获取Stream流: 4.一堆零散数据: Stream接口中的静态方法 3.Stream流的…

使用友元函数访问私有数据

如果在本类以外的其他地方定义了一个函数(这个函数可以是不属于任何类的非成员函数,也可以是其他类的成员函数),在类体中用friend对其进行声明,此函数就称为本类的友元函数。友元函数可以访问这个类中的私有成员。正如…

数据结构(3.5)——队列的顺序实现

队列的顺序实现 #define MaxSize 10//定义队列中元素的最大个数 typedef struct {int data[MaxSize];//用静态数组存放队列元素int front, rear;//队头指针和队尾指针 } SqQueue;void testQueue() {SqQueue Q;//声明一个队列(顺序存储) } 队列的初始化操作和判空 //初始化队…

昇思25天学习打卡营第11天 | LLM原理和实践:基于MindSpore实现BERT对话情绪识别

1. 基于MindSpore实现BERT对话情绪识别 1.1 环境配置 # 实验环境已经预装了mindspore2.2.14,如需更换mindspore版本,可更改下面mindspore的版本号 !pip uninstall mindspore -y !pip install -i https://pypi.mirrors.ustc.edu.cn/simple mindspore2.2…

Rust变量绑定

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

ESP32 通过蓝牙显示歌词代码示例

通过蓝牙协议播放音乐,有的时候需要显示歌词,这里就是a2dp库获取了歌词 值得注意的是要想正确获取到歌词,必须打开各种播放器的字幕(歌词)开关 本项目用了三个开源库 a2dp,tft_espi,xfont. a2dp &#x…

ITWin Capture Modeler:打造卓越的软件模型的终极工具

在软件开发和设计领域,寻找一款高效且功能强大的软件模型工具是每个开发人员的追求。而经过多年的实践和尝试,我终于找到了一款令人印象深刻的工具——ITWin Capture Modeler。它不仅具备出色的功能和灵活性,而且能够极大地提高开发效率和质量…

计算机网络体系结构详解:协议与分层

在学习计算机网络时,理解网络协议与分层体系结构是至关重要的。本文将详细介绍这些概念,帮助基础小白快速入门。 1. 什么是网络协议 网络协议是计算机网络中用于数据交换的规则和标准。这些规则规定了数据格式、时序以及发送和接收数据时的动作。网络协…

数学不好能搞人工智能吗?

很遗憾,不能。 人工智能(AI)实际上是一个将数学、算法理论和工程实践紧密结合的领域。AI 扒开来看就是算法,也就是数学、概率论、统计学、各种数学理论的体现。 新的时代,程序员想要跨入 AI 之门,只要稍微…

FTP、http 、tcp

HTTP VS FTP HTTP :HyperText Transfer Protocol 超文本传输协议,是基于TCP协议 FTP: File Transfer Protocol 文件传输协议, 基于TCP协议, 基于UDP协议的FTP 叫做 TFTP HTTP 协议 通过一个SOCKET连接传输依次会话数…

奇舞周刊第532期:奇舞团生日快乐~

时光荏苒,岁月如歌,转眼间,奇舞团13岁啦🎂🎂🎂《奇舞周刊》也陪伴大家来到了第532期。👏👏 致敬每一位读者和创作者,是你们的热情、陪伴和鼓励,让我们不断前进…