文件路径与Resource接口详解

目录

友情提醒:

先看目录,了解文章结构,点击目录可跳转到文章指定位置。

第一章、快速了解文件路径

1.1)什么是文件路径?

文件路径:是指向文件或目录(文件夹)在存储系统中的位置的标识符。通过文件路径,操作系统可以找到并访问该文件或目录。文件路径可以是绝对的,也可以是相对的。

1.1.1)绝对路径

绝对路径从根目录开始,一直到达目标文件或目录的完整路径。它包含了从根目录到目标文件或目录的所有目录名,绝对路径是固定的

Windows系统中的绝对路径:

java 复制代码
C:\Users\Username\Documents\file.txt

在Unix/Linux/macOS系统中的绝对路径:

java 复制代码
/home/username/documents/file.txt

两者的目录分隔符有区别

java 复制代码
在Windows中是\,在Unix/Linux/macOS中是/

1.1.2)相对路径

相对路径是从当前工作目录,开始到目标文件或目录的路径。它不包含从根目录开始的完整路径,而是相对于当前目录的位置。因此,相对路径可能因当前工作目录的不同而有所不同。

如果file.txt文件位于test子目录中,相对路径则是:

java 复制代码
test/file.txt

1.2)重要:相对路径的表示方法

1.2.1) ./ 与 .../

./代表当前目录

java 复制代码
./:代表当前目录。例如你在一个名为project的目录中,./指  project目录本身。

./file.txt:表示当前目录下的 file.txt 文件。

./subdir/:表示当前目录下的 subdir 子目录。

.../表示上一级目录

java 复制代码
../:表示上一级目录(也称为父目录)

../file.txt:表示上一级目录中的 file.txt 文件。

../subdir/:表示上一级目录中的 subdir 子目录。

1.3)文件路径与环境变量

1.3.1)什么是环境变量

环境变量定义是操作系统路径、文件名等。环境变量命令行中直接引用,也可以被操作系统中的程序或脚本引用。例如Windows系统中常见的环境变量包括:

java 复制代码
%USERPROFILE%:表示当前用户的主目录路径,如C:\Users\用户名。
%TEMP%:表示系统的临时文件夹路径,如C:\Users\用户名\AppData\Local\Temp。
%WINDIR%或%WINDOWS%:表示Windows安装目录的路径,如C:\Windows。

在Unix/Linux/macOS中:

java 复制代码
$HOME:表示当前用户的主目录路径,如/home/用户名。
$PATH:表示可执行文件的搜索路径,由多个目录通过冒号:分隔。

使用echo $PATH查看path中包含的路径:

在使用命令时,系统按照 PATH 中定义的路径逐个查找,直到找到对应的执行文件。例如当安装了Java的jdk,执行javac命令时发现不可用,此时需要将jdk的安装目录添加到PATH中,使执行javac命令时能够通过PATH变量包含的路径查找。

1.3.2)环境变量设置举例

jdk1.8安装教程及环境变量配置

Linux虚拟机安装JDK及环境变量配置

第二章、操作系统的文件路径

2.1)常用文件路径

2.1.1)Windows操作系统目录

目录 解释
C: C盘是系统盘,用于安装操作系统(如Windows)以及系统相关的文件和程序
D: D盘是操作系统的逻辑分区,通常用户的个人数据保存在非系统盘上。
C:\Users<username> 用户的主目录,其中是用户的登录名。
C:\Windows Windows系统文件存放的目录。
C:\Program Files 安装的程序文件通常存放在此目录下。

2.1.2)Linux操作系统目录

目录 解释
/ 表示根目录
/home 用户主目录的基点,例如用户user的主目录就是/home/user。
/tmp 公用的临时文件存储点。
/root 系统管理员的主目录。
/etc 系统管理和配置文件存放的目录。
/bin、/sbin、/usr/bin 存放可执行文件的目录。
/etc/hosts 表示根目录下的 etc 文件夹中的 hosts 文件。
~ 表示当前用户的主目录(home directory)
~/Documents/file.txt 表示当前用户主目录下的 Documents 文件夹中的 file.txt 文件。

2.2)Windows系统CMD(命令提示符)

2.2.1)CMD命令:目录和文件导航

java 复制代码
cd <目录路径>:更改当前目录到指定的目录路径。例如,cd C:\Users\Example\Documents 

cd ..:不是 cd..(注意空格):返回上一级目录:这会将当前目录更改为其父目录

cd %HOMEPATH% :可以进入环境变量指定的路径

盘符后跟冒号(例如 C:):切换盘符,然后按下 Enter 键

dir:列出当前目录中的文件和子目录。可以使用dir /s列出所有子目录中的文件和文件夹。

2.2.2)CMD命令目录和文件管理

java 复制代码
mkdir:创建新目录,例如,mkdir newfolder会在当前目录下创建一个名为newfolder的新文件夹。

rmdir:删除空目录。注意,rmdir只能删除空目录。

rmdir /s /q 目录名:删除非空目录,其中/s表示删除指定目录及其所有子目录和文件,/q表示安静模式。

del:删除一个或多个文件。例如,del filename.txt会删除当前目录下的filename.txt文件。

2.3)Linux系统命令

2.3.1)Linux命令:目录和文件导航

java 复制代码
cd <目录路径>:更改当前目录到指定的目录路径。例如,cd /home/username/Documents

cd ..:返回上一级目录。

cd ~:进入当前用户的主目录。注意,这与Windows中的cd %HOMEPATH%相似,但~是Linux特有的快捷方式。

cd -:切换到上一次所在的目录。这是Linux特有的一个快速切换功能。


ls:列出当前目录中的文件和子目录。
ls -R可以递归列出所有子目录中的文件和文件夹
ls -l以列表形式显示详细信息,
ls -a显示所有文件(包括以点.开头的隐藏文件)。

pwd:显示当前工作目录的完整路径

2.3.2)Linux命令:目录和文件管理

请注意,rm -rf命令非常危险,因为它可以删除任何目录及其内容,包括根目录(/),从而导致系统崩溃。

java 复制代码
mkdir <目录名>:创建新目录。
例如,mkdir newfolder会在当前目录下创建一个名为newfolder的新文件夹。
例如,mkdir -p a/b/c会创建a、b和c目录,即使a和b目录不存在。

rmdir <目录名>:删除空目录。与Windows中的rmdir相同,只能删除空目录。
rm -r <目录名>:删除非空目录及其所有内容。这里的-r选项表示递归删除。
rm <文件名>:删除一个或多个文件。rm filename.txt会删除当前目录下的filename.txt文件。
rm -f <文件名>:强制删除文件,忽略不存在的文件,并且不会有任何提示。
rm -p:删除多级空目录。

cp:复制目录。复制目录时需要使用-r(或-R)选项来递归复制目录及其内容。
例如,cp -r source_dir target_dir会将source_dir目录及其所有子目录和文件
复制到target_dir目录中。如果target_dir不存在,它将被创建。

mv:移动或重命名目录。可以将目录从一个位置移动到另一个位置,或者在同一位置重命名目录。
例如,mv old_dir new_dir会将old_dir目录重命名为new_dir,
如果new_dir是一个存在的目录,则old_dir及其内容会被移动到new_dir下。

第三章、Java中SpringBoot相关路径

3.1)resources特殊资源目录

在Java开发中,resources文件夹是一个至关重要的部分。它主要用于存放Java工程中的各种非源代码资源文件,这些资源文件可以是配置文件(如properties或XML文件)、图片、音频、模板文件等。Resource文件夹的作用主要体现在以下几个方面:

简化资源加载:Java提供了多种方式加载Resource目录中的文件,简化了资源加载的过程。开发者可以通过类路径(classpath)轻松访问这些资源。

跨平台兼容性:当Java项目被打包成JAR或WAR文件时,Resource目录中的文件会被自动包含在内,从而确保了跨平台兼容性。

在典型的Java项目结构中,Resource文件夹通常位于

java 复制代码
src/main/resources(用于主应用程序的资源文件)
src/test/resources(用于测试相关的资源文件)下。

子目录:

java 复制代码
src/main/resources/static:用于存放静态资源文件
(如HTML、CSS、JavaScript、图片等)。
这些资源文件可以直接通过Web访问,访问路径为"/文件名"。

src/main/resources/public:用于存放静态资源文件,优先级略低于static目录。

src/main/resources/templates:用于存放模板文件,
如使用Thymeleaf、FreeMarker等模板引擎时所需的HTML模板文件。
这些模板文件通常用于渲染Web页面。

classpath:/META-INF/resources:用于加载JAR包中的资源文件。如果
资源文件被打包在JAR包的META-INF/resources目录下,那么这些资源文件也可以通过Web访问

3.2)类路径classpath

3.2.1)什么是类路径

类路径(Classpath)是Java应用程序查找类文件(.class)和其他资源文件(如属性文件、XML配置文件等)的一组目录、JAR文件(Java ARchive)和ZIP文件的集合。它是Java虚拟机(JVM)和Java编译器在运行时和编译时用于定位类和其他资源的路径。

在Java中,类路径的作用类似于操作系统的PATH环境变量,但它是专门用于Java应用程序的。当Java应用程序运行时,JVM会沿着类路径查找并加载所需的类。如果JVM在类路径中找不到某个类,它将抛出ClassNotFoundException异常。

java 复制代码
src/main/java:存放Java源代码文件的目录。这些源代码文件在编译后会
生成.class文件,并放置在构建输出目录(如Maven的target/classes)中,
这些.class文件随后会被包含在classpath中。

src/main/resources:存放资源文件的目录,如配置文件(applicati
on.properties)、静态资源(如图片、CSS、JavaScript文件等,
这些资源文件在构建过程中会被复制到构建输出目录,并包含在classpath中。

依赖的JAR包:项目所依赖的第三方库(JAR包)也会被包含在classpath中。
这些JAR包通常通过Maven或Gradle等构建工具管理,并在构建过程中被
添加到项目的构建路径中。特殊资源目录

3.2.2)yml文件中配置resources下的文件路径

使用类路径(classpath:前缀)来引用这些文件

java 复制代码
# application.yml
resources:
  configFilePath: classpath:config/application.properties
  staticFilesDir: classpath:static/

3.3)Resource接口

3.3.1)Resource接口常用方法

方法 签名 描述
getInputStream() InputStream getInputStream() throws IOException 找到并打开资源,返回一个InputStream以从资源中读取数据。每次调用通常都会返回一个新的InputStream实例
exists() boolean exists() 判断资源是否以物理形式存在。返回一个布尔值,如果资源存在则返回true,否则返回false。
isFile() boolean isFile() 判断这个资源是否代表了一个文件系统的文件。如果资源是一个文件系统文件,则返回true,否则返回false。
getURL() URL getURL() throws IOException 返回一个资源的URL句柄。如果资源不能被解析为URL,则抛出IOException。
getFile() File getFile() throws IOException 返回资源对应的File对象。如果资源不能被解析为绝对路径的文件,则抛出FileNotFoundException。
getFilename() String getFilename() 返回资源的文件名。这通常是资源的最后一部分路径名。

不同的Resource实现类可能会对这些方法有不同的实现方式。例如,ClassPathResource会从类路径中加载资源,而FileSystemResource会从文件系统中加载资源。因此,在使用这些方法时,需要了解所使用Resource实现类的具体行为。

3.3.2)Resource接口使用示例

ClassPathResource从类路径中加载资源,
resource.getFile()获取File对象,
InputStream inputStream = resource.getInputStream() // 使用inputStream读取文件内容

java 复制代码
import org.springframework.core.io.ClassPathResource;  
import org.springframework.core.io.Resource;  
  
import java.io.File;  
import java.io.IOException;  
  
public class ResourceLoaderExample {  
  
    public static void main(String[] args) {  
        Resource resource = new ClassPathResource("tamp/content.excel");  
        
            try {  
                File file = resource.getFile();  
                // 使用inputStream读取文件内容...  
				InputStream inputStream = resource.getInputStream();
				
                System.out.println("文件存在: " + file.getAbsolutePath());  
            } catch (IOException e) {  
                System.err.println("无法获取文件路径: " + e.getMessage());  
            }  
    }  
}

3.3.3)加载文件资源

在Java代码中,使用Resource或ResourceLoader来加载下面这些资源。

java 复制代码
 # application.yml
resources:
  configFilePath: classpath:config/application.properties
  staticFilesDir: classpath:static/

代码:

java 复制代码
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.io.Resource;
import org.springframework.core.io.ResourceLoader;

@Configuration
public class ResourceConfig {

	//@Value注解获取配置文件中的值
    @Value("${resources.configFilePath}")
    private String configFilePath;
    
	//@Value注解获取配置文件中的值
    @Value("${resources.staticFilesDir}")
    private String staticFilesDir;

    private final ResourceLoader resourceLoader;

    public ResourceConfig(ResourceLoader resourceLoader) {
        this.resourceLoader = resourceLoader;
    }
/示例 1
    @Bean
    public Resource configResource() {
   		//此时configFilePath已经被@value注解注入了文件路径
   		//也就是列出classpath:config/application.properties文件
       Resource  resource = resourceLoader.getResource(configFilePath);
        return resource;
    }
/示例 2
    @Bean
    public Resource[] staticResources() {
       //此时staticFilesDir已经被@value注解注入了文件路径,
       //也就是列出classpath:static/example.txt
        return new Resource[]{
        resourceLoader.getResource(staticFilesDir + "example.txt")}; 
    }
}
相关推荐
Q_192849990627 分钟前
基于Spring Boot的工商局商家管理系统
java·spring boot·后端
m0_7482326438 分钟前
[MySQL报错]关于发生net start mysql 服务无法启动,服务没有报告任何错误的五种解决方案。
java
小Mie不吃饭40 分钟前
Linux | Ubuntu零基础安装学习cURL文件传输工具
学习
小学鸡!1 小时前
idea报错:There is not enough memory to perform the requested operation.
java·intellij-idea
A懿轩A1 小时前
C/C++ 数据结构与算法【哈夫曼树】 哈夫曼树详细解析【日常学习,考研必备】带图+详细代码
c语言·c++·学习·算法·哈夫曼树·王卓
新中地GIS开发老师1 小时前
25考研希望渺茫,工作 VS 二战,怎么选?
javascript·学习·考研·arcgis·地理信息科学·地信
sensen_kiss1 小时前
CAN201 Introduction to Networking(计算机网络)Pt.3 网络层
网络·学习·计算机网络·智能路由器
朝九晚五ฺ1 小时前
【Linux探索学习】第二十四弹——软硬链接:Linux 中的软链接与硬链接详解
linux·运维·chrome·学习
L.S.V.2 小时前
Java 溯本求源之基础(三十)——封装,继承与多态
java·开发语言
码农爱java2 小时前
设计模式--装饰器模式【结构型模式】
java·设计模式·面试·装饰器模式·原理·23 中设计模式