【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.mzph.cn/diannao/41726.shtml

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

相关文章

HCIA综合实验

学习新思想,争做新青年。今天学习的是HCIA综合实验! 实验拓扑 实验需求 总部: 1、除了SW8 SW9是三层交换机,其他交换机均为2层交换机。 2、GW为总部的出口设备,使用单臂路由技术,VLAN10,20,100的网关都在GW…

ERROR: “armeabi-v7a“ not supported for HarmonyOS

IDE 从 devecostudio-mac-4.1.3.700 升级至 devecostudio-mac-5.0.3.403 后抛出了如下异常: ERROR: "armeabi-v7a" not supported for HarmonyOS. 解决办法 一.entry/build-profile.json5 需 entry/build-profile.json5 的 abiFilters 中移除 "armeabi-v7a&qu…

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

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

基于java+springboot+vue实现的流浪动物管理系统(文末源码+Lw)277

摘 要 在如今社会上,关于信息上面的处理,没有任何一个企业或者个人会忽视,如何让信息急速传递,并且归档储存查询,采用之前的纸张记录模式已经不符合当前使用要求了。所以,对流浪动物信息管理的提升&…

【React】React18 Hooks之useState

目录 useState案例1(直接修改状态)案例2(函数式更新)案例3(受控表单绑定)注意事项1:set函数不会改变正在运行的代码的状态注意事项2:set函数自动批量处理注意事项3:在下次…

[数据集][目标检测]护目镜检测数据集VOC+YOLO格式888张1类别

数据集格式:Pascal VOC格式YOLO格式(不包含分割路径的txt文件,仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件) 图片数量(jpg文件个数):888 标注数量(xml文件个数):888 标注数量(txt文件个数):888 标注类别…

ORB 特征点提取

FAST关键点 选取像素p,假设它的亮度为Ip; . 设置一个阈值T(比如Ip的20%); 以像素p为中心,选取半径为3的圆上的16个像素点; 假如选取的圆上,有连续的N个点的亮度大于IpT或小于…

Redis 八股文

标题 1. Redis主从同步原理:判断下线的条件:故障转移如何保证Sentinel高可用 1. Redis主从同步原理: 1、slave执行命令向master建立连接 2、master执行bgsave(后台存储),生成rdb快照(redis备份方式&#x…

日志自动分析-Web---360星图GoaccessALBAnolog

目录 1、Web-360星图(IIS/Apache/Nginx) 2、Web-GoAccess (任何自定义日志格式字符串) 源码及使用手册 安装goaccess 使用 输出 3-Web-自写脚本(任何自定义日志格式字符串) 4、Web-机器语言analog(任何自定义日…

游戏AI的创造思路-技术基础-强化学习(1)

我们“强化”一下机器的“学习”,让机器变得更强~~~~ 目录 1. 强化学习的定义 2. 发展历史 3. 强化学习的基本概念和函数 3.1. 基本概念和函数 3.1.1. 基本概念和函数 3.1.2. Q函数 3.1.2.1. 定义与作用 3.1.2.2. 数学表示 3.1.2.3. 更新规则 3.1.2.4. 算…

AI时代算法面试:揭秘高频算法问题与解答策略

三种决策树算法的特点和区别 ID3算法:基本的决策树算法,适用于简单的分类问题C4.5算法:改进了ID3算法,适用于更复杂的分类问题,可以处理连续型数据和缺失值CART算法:更加通用的决策树算法,适用于…

云服务器在 Web 应用程序中作用

云服务器在Web应用程序中扮演着至关重要的角色,它不仅是现代Web应用程序的基石,还是推动业务发展和提升用户体验的关键技术之一。下面将详细探讨云服务器在Web应用程序中的重要作用及其优势。 首先,云服务器为Web应用程序提供了高度可扩展的…

【postgresql】索引

见的索引类型: B-tree 索引:这是最常用的索引类型,适用于大多数查询。B-tree索引可以高效地处理范围查询。 Hash 索引:适用于等值查询,但不支持范围查询。 GiST 索引:通用搜索树(GiST&#xf…

怀念旧的Windows声音?以下是如何在Windows 11中恢复它们

如果你渴望旧的Windows声音,希望能在Windows 11上再次听到,那你就很幸运了。我们将向你展示如何下载必要的声音包并创建复古的声音方案。 如何获取旧Windows声音的声音包 你需要做的第一件事是下载一个包含旧Windows版本声音的声音包。此外,请确保它包含的每个声音都是WAV…

在 Vue 项目中使用 FullCalendar

1、先安装依赖包,根据自己的需求安装,建议使用cnpm安装,不然会很慢有时候会出现安装不上的情况。 npm i fullcalendar/vue --save npm i fullcalendar/core --save // 在月视图或日视图中操作事件 npm i fullcalendar/daygrid --save // 在…

记录discuz修改用户的主题出售价格

大家好,我是网创有方的站长,今天遇到了需要修改discuz的主题出售价格。特此记录下 方法很简单: 进入用于组-》选择论坛-》批量修改

【shell编程小项目】

目录 一、项目拓扑二、要求三、shell编程 一、项目拓扑 二、要求 环境准备: 准备两个虚拟机,按照环境配置好对应的 IP 地址和对应的主机名和 SSH 密钥登录在 workstation.exam.com 节点实现如下需求: 1、编写 Shell 脚本,要求代码…

0803实操-Windows Server系统管理

Windows Server系统管理 系统管理与基础配置 查看系统信息、更改计算机名称 网络配置 启用网络发现 Windows启用网络发现是指在网络设置中启用一个功能,该功能允许您的计算机在网络上识别和访问其他设备和计算机。具体来说,启用网络发现后&#xff…

Qt5.9.9 关于界面拖动导致QModbusRTU(QModbusTCP没有测试过)离线的问题

问题锁定 参考网友的思路: Qt5.9 Modbus request timeout 0x5异常解决 网友认为是Qt的bug, 我也认同;网友认为可以更新模块, 我也认同, 我也编译了Qt5.15.0的code并成功安装到Qt5.9.9中进行使用,界面拖…

Mybatis原生使用

一、MyBatis初次使用 2.1 环境搭建步骤 MyBatis 的 API : https://mybatis.org/mybatis-3/zh/getting-started.html 1.引入依赖包 2.准备核心配置件 db.properties drivercom.mysql.cj.jdbc.Driver urljdbc:mysql://123.57.206.19:3306/demo?useUnicodetrue&am…