使用 类加载器 或者 类对象 读取文件(参考的路径都是编译以后的文件夹,out 或者 target 文件夹 )

news2024/11/18 12:30:37
  • 以下内容 本人都是 用 Maven 工程总结的 ,所以会和普通项目的项目目录不太一样。
  • 相对路径:项目根目录 开始查找。( 但是在我们真正开发的时候,我们读到的更多的文件并不是直接放在我们项目里面这个文件夹里面,而是放在我们模块里面
  • 同理可得,我们直接创建 文件 b.txt 会在项目的根目录下创建文件

        File file = new File("b.txt");
        file.createNewFile();
        System.out.println(file.getAbsolutePath());//F:\IdeaProjects\workspace\review\b.txt

 1、使用 类对象 读取文件

 Class 中的 getResourceAsStream() 方法

  • 下面解释中提到的 资源 就是我们要找的 文件,文件就相当于上面的b.txt
  • 下面的 Module 是 java 中的一个类,因为在 Java 中万物皆对象,是一个模块类,Module也有一个方法是 getResourceAsStream
  • 下面的 类装入器 就是 类加载器
  • 查找具有给定名称的资源
  • 如果该 位于命名 模块 中,则此方法将尝试在 模块 中查找 资源。这是通过委托给模块的类装入器 findResource(String,String)方法完成的,用模块名和资源的绝对名称调用它。命名模块中的资源受 Module.getResourceAsStream方法中指定的封装规则的约束,因此当资源是包中的非 ".class"资源,且该资源未对调用者的模块打开时,此方法返回 null。
  • 否则,如果该类不在命名模块中,则搜索与给定类关联的资源的规则由类的定义类装入器实现。此方法委托给此类对象的类装入器。如果这个类对象是由引导类加载器加载的,则该方法委托给ClassLoader.getSystemResourceAsStream.
  • 在委托之前,使用以下算法从给定的资源名称构造绝对资源名:
  • 如果名称以  '/' ('\u002f')  开头,则资源的绝对名称是名称中  '/'  后面的部分。
  • 否则,绝对名称为以下形式:
  • modified_package_name/name
  • 其中 modified_package_name/name 是该对象的包名,用 '/'  代替  '.' ('\u002e')
  • 参数:name ——  资源的名称
  • 返回:InputStream 对象;如果没有找到具有此名称的资源,则该资源位于至少未对调用方模块打开的包中,或者安全管理器 拒绝 绝对 该资源的访问
  • 抛出:NullPointerException ——   如果名称为空
  • 自从  1.1  开始
  • 参见:Module.getResourceAsStream ( String )
  • 修改后的  9  版本
  • 如果输入的路径对应的文件不存在,返回 null
  • 参考的是 Class 类对象 对应的  .class 字节码文件 所在的路径
  • F: \ IdeaProjects \ workspace \ review \ reflect \ target \ classes \ com \ csdn \ clz  \ Person.class
  • 因为我创建的 是 Maven 工程,所以编译以后的文件在 target 里面,所以只要把 我们要读取的文件放在  clz 这个文件夹里面就可以读取到,其实就是和 Person.class字节码文件在同一个文件夹下,就可以被读取到
  • 如果不是 Maven 工程,编译以后的文件在 out 文件夹里
  • F: \ IdeaProjects \ workspace \ review \ reflect \ target  \classes \ com \ csdn \ clz \ reflect.txt

 

package com.csdn.clz;
import com.csdn.pojo.Student;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.io.*;

/**
 * 使用 类对象 读取文件
 */
public class LoaderDemo3 {
    public static void main(String[] args) throws IOException {

        File file = new File("b.txt");
        file.createNewFile();
        System.out.println(file.getAbsolutePath());//F:\IdeaProjects\workspace\review\b.txt

//        new File("reflect/src/main/java/com/csdn/clz/reflect.txt").createNewFile();

        //相对路径:项目的根目录开始查找
        FileInputStream fis = new FileInputStream("b.txt");
        System.out.println(fis);//java.io.FileInputStream@776ec8df

        Class<Person> clz = Person.class;
        InputStream stream1 = clz.getResourceAsStream("b.txt");
        System.out.println(stream1);//null

        Class<Person> per = Person.class;
        InputStream inputStream = per.getResourceAsStream("reflect.txt");
        System.out.println(inputStream);//java.io.BufferedInputStream@7ba4f24f

        Class<Student> stu = Student.class;
        InputStream inputStream1 = stu.getResourceAsStream("../clz/reflect.txt");
        System.out.println(inputStream1);//java.io.BufferedInputStream@3b9a45b3

    }
}
@Data
@NoArgsConstructor
@AllArgsConstructor
class Person {
    private String name;
    private int age;
}

2、使用 类加载器 读取文件 

调用 ClassLoader 里的  getResourceAsStream(String path)方法

  • 参考的路径是:当前模块编译以后,在 out 文件夹里的路径(如果是 Maven 工程,则参考的是 target 文件夹里的路径 )
  • 如果 是 out 文件夹,则参考的是 out 文件夹下 的 模块文件夹 下开始的路径

  • 如果是 Maven 工程 ,则参考的是 target 文件夹下 的 classes 文件下开始的路径

package com.csdn.clz;
import com.csdn.pojo.Student;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.io.*;
/**
 * 使用类加载器  读取文件
 */
public class LoaderDemo3 {
    public static void main(String[] args) throws IOException {

        Class<Person> clz = Person.class;
        ClassLoader appClassLoader = clz.getClassLoader();
        InputStream stream = appClassLoader.getResourceAsStream("reflect.txt");
        System.out.println(stream);//null

        InputStream stream2 = appClassLoader.getResourceAsStream("com/csdn/clz/reflect.txt");
        System.out.println(stream2);//java.io.BufferedInputStream@7cca494b

        Class<Student> studentClass = Student.class;
        ClassLoader classLoader = studentClass.getClassLoader();
        InputStream stream3 = classLoader.getResourceAsStream("com/csdn/clz/reflect.txt");
        System.out.println(stream3);//java.io.BufferedInputStream@7ba4f24f

    }
}
@Data
@NoArgsConstructor
@AllArgsConstructor
class Person {
    private String name;
    private int age;
}

 3、两者用哪种方式读取更好一些?

  • 类加载器 更好一些,因为它更稳定
  • 因为 用类对象 读取文件,用的类对象不一样,我们的参考路径就不一样。

  •  但是我们用 类加载器 读取,不管 类对象 怎么改变,我们的参考路径都是一样的

4、怎样解决以上 路径问题 带来的 麻烦呢?

  • 总是去思考我们要参考的路径,极大的降低了我们开发的效率,所以开发工具统一 设置了一个文件夹来存储这些配置文件,也就是我们要读取的文件
  • 在 Maven 工程中,会自动给我们生成一个叫 resources 这个名字的文件夹,我们只需要把要读取的文件放在 resources 这个文件夹下面,当我们执行代码后,也就是运行编译后,开发工具会自动把要读取的文件放入以上要参考的路径所对应的文件夹下面

 

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

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

相关文章

OpenAI 现已开始考虑自研 AI 芯片战略

根据 TechCrunch 的报道&#xff0c;随着 AI 芯片短缺的问题日益严重&#xff0c;OpenAI 现已开始考虑自研 AI 芯片。 据悉&#xff0c;从去年开始 OpenAI 内部就已经开始讨论 AI 芯片战略&#xff0c;以解决其 AI 芯片短缺的问题。这些方案包括自研 AI 芯片、与英伟达等芯片制…

用节点亲和性把 Pod 分配到节点

用节点亲和性把 Pod 分配到节点 当前集群信息&#xff1a; rootk8s-master:~# kubectl get node -o wide NAME STATUS ROLES AGE VERSION INTERNAL-IP EXTERNAL-IP OS-IMAGE KERNEL-VERSION CONTAINER-RUNTIME k8s…

宝塔部署code-server

大家好&#xff0c;我叫徐锦桐&#xff0c;个人博客地址为www.xujintong.com。平时记录一下学习计算机过程中获取的知识&#xff0c;还有日常折腾的经验&#xff0c;欢迎大家来访。 code-server其实就是vscode网页版&#xff0c;可以实现随时随地编程。那么本教程是将源码的二进…

理解电路:从电报机到门电路,我们如何做到“千里传信”?

目录 背景 从信使到电报&#xff0c;我们怎么做到“千里传书”&#xff1f; 理解继电器&#xff0c;给跑不动的信号续一秒 小结 背景 所有最终执行的程序其实都是使用“0”和“1”这样的二进制代码来表示的。我们知道&#xff0c;对应的整数和字符串&#xff0c;其实也是用…

2023 年和 2024 年 10 个最佳加密货币趋势

1.熊市低迷 加密货币市场已进入持续数月的长期看跌阶段。尽管 2023 年初出现了一些看涨走势&#xff0c;但大多数领先的加密货币随后都出现了看跌低迷&#xff0c;导致其市值大幅下跌。 此外&#xff0c;持续的熊市可归因于一系列因素&#xff0c;包括宏观经济不确定性、利率…

复杂系统设计基本注意事项

目录 一、软件复杂性度量方法 &#xff08;一&#xff09;McCabe度量方法 &#xff08;二&#xff09;John Ousterhout度量方法 &#xff08;三&#xff09;一般建议 二、复杂性带来的危害 &#xff08;一&#xff09;修改扩散&#xff08;Modification Diffusion&#x…

力扣每日一题54:螺旋矩阵

题目描述&#xff1a; 给你一个 m 行 n 列的矩阵 matrix &#xff0c;请按照 顺时针螺旋顺序 &#xff0c;返回矩阵中的所有元素。 示例 1&#xff1a; 输入&#xff1a;matrix [[1,2,3],[4,5,6],[7,8,9]] 输出&#xff1a;[1,2,3,6,9,8,7,4,5]示例 2&#xff1a; 输入&#…

电路电子技术4 等效电阻的计算实际电源等效变换

1.等效电阻的计算 思路&#xff1a;清楚电路结构即可。可以看到&#xff08;R1//R2&#xff09;&#xff08;R3//R4&#xff09;。 这样即可得到答案C。 2.电流源等效电压源 实际电压源等效为实际电流源时&#xff0c;电流源的电激流应等于电压源的源电源除以电压源的内阻。 实…

django基于Python的房价预测系统+爬虫+大屏可视化分析

欢迎大家点赞、收藏、关注、评论 文章目录 前言一、项目介绍二、开发环境三、功能需求分析1 数据采集功能设计2数据管理功能设计3爬虫功能需求分析4 数据可视化功能需求分析数据库表的设计 四、核心代码五、效果图六、文章目录 前言 房价是一个国家经济水平的重要体现&#xff…

JS加密/解密之闭包的运用

深入探讨JavaScript闭包的演变与应用 摘要&#xff1a; 本文将深入探讨JavaScript闭包的概念、特性以及其在实际开发中的应用。我们将从闭包的起源开始&#xff0c;探讨它在JavaScript编程中的重要性&#xff0c;并通过实例展示闭包在不同场景下的灵活应用。 引言 JavaScrip…

2005.6-2018.6月中国企业OFDI微观数据

2005.6-2018.6月中国企业OFDI微观数据 1、时间&#xff1a;2005.6-2018.6 2、范围&#xff1a;公司 3、指标&#xff1a;Year、Month、Chinese Entity、 Quantity in Millions 、Share size、Transaction Party、Sector、Subsector、Country、Region、BRI 4、数据解释&…

矩阵的转置c++

大家好&#xff0c;我叫徐锦桐&#xff0c;个人博客地址为www.xujintong.com。平时记录一下学习计算机过程中获取的知识&#xff0c;还有日常折腾的经验&#xff0c;欢迎大家来访。 介绍 由下面的图片可以看出&#xff0c;从左上角到右上角的那条斜线是分界线&#xff08;这条…

微信小程序之微信授权登入及授权的流程讲解

目录 一、流程讲解 1. 图解 2. 讲解 二、官方登入 wxLogin wx.getUserProfile 代码 三、数据交互授权登入 1. 前端 2. 后端代码 一、流程讲解 1. 图解 2. 讲解 这张图片是关于微信小程序授权登录的流程图。流程图展示了使用微信官方提供的登录能力来获取用户身份标识…

再也不被时间束缚:C++ stdchrono时间库全面解析

C stdchrono时间库全面解析 一、引言二、C std::chrono时间库概述2.1、std::chrono命名空间的作用和用途2.2、基本组成部分&#xff1a;duration、time_point和clock 三、duration的使用详解3.1、duration表示时间段的概念和使用方法3.2、duration的各种单位和精度选项3.3、使用…

使用c++实现简易线程池

线程池其实就是一堆处理任务的线程和 一个任务队列 &#xff0c;处理线程不断地从这个任务队列中拿出任务进行处理。 不过需要注意的是 对于这个任务队列需要保证线程安全 一个简易的线程池需要 1&#xff0c;一个向任务队列中添加任务的接口 2&#xff0c;一个从任务队列中取…

Zabbix告警与飞书集成

一、配置媒介 1、下载飞书的Zabbix媒介类型如下&#xff1a; zbx_export_mediatype_feishu.xml 2、Zabbix中导入媒介类型 Zabbix Web中选择管理 > 报警媒介&#xff0c;然后导入该媒介类型。导入规则选择“更新现有的”和“创建新的”。 3、配置飞书媒介类型用户 Zabbi…

【游记】CSP2023-S2

本来不像另起一篇的&#xff0c;但是hb要求了还是写一下 游记 考前 考场电脑好迷你&#xff0c;我来的早是第一个入场的&#xff0c;抹了点清凉油无聊一直在用手量设备的尺寸 开考前十分钟左右就下发文件了&#xff0c;题面密码还没有公布&#xff0c;但是大样例已经可以看…

uCOSIII实时操作系统 十 事件标志组

目录 事件标志组&#xff1a; 事件标志组API函数&#xff1a; 创建事件标志组&#xff1a; 等待事件标志组&#xff1a; 向事件标志组发送标志&#xff1a; 事件标志组实验&#xff1a; 事件标志组&#xff1a; 有时候一个任务可能需要和多个事件同步这个时候就需要使用事…

word修改公式默认字体并打出漂亮公式

文章目录 word公式简介传统方法1——mathtype传统方法2——word自带公式编辑器最简洁方法——更改word自带公式字体快捷方式效果展示 word公式简介 word自带的公式字体Cambria Math不可否认很丑&#xff0c;要打出latex格式的漂亮字体很困难。使用Markdown工具很多只能导出为不…

基于WebRTC的程序因虚拟内存不足导致闪退问题的排查以及解决办法的研究

目录 1、WebRTC简介 2、问题现象描述 3、将Windbg附加到目标进程上分析 3.1、Windbg没有附加到主程序进程上&#xff0c;没有感知到异常或中断 3.2、Windbg感知到了中断&#xff0c;中断在DebugBreak函数调用上 3.3、32位进程用户态虚拟地址和内核态虚拟地址的划分 …