使用 类加载器 或者 类对象 读取文件

news/2024/5/19 2:26:52 标签: 反射, 类对象
  • 相对路径:项目根目录 开始查找。( 但是在我们真正开发的时候,我们读到的更多的文件并不是直接放在我们项目里面这个文件夹里面,而是放在我们模块里面
  • 同理可得,我们直接创建 文件 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;
}


http://www.niftyadmin.cn/n/5110530.html

相关文章

信息学奥赛一本通1000:入门测试题目

1000&#xff1a;入门测试题目 时间限制: 1000 ms 内存限制: 32768 KB 提交数: 318392 通过数: 190210 【题目描述】 求两个整数的和。 【输入】 一行&#xff0c;两个用空格隔开的整数。 【输出】 两个整数的和。 【输入样例】 2 3 【输出样例】 5 思路&#…

如何确定自己的armbian系统是不是ARM64架构

使用 arch 命令&#xff1a; arch 命令会返回当前系统的架构信息。 arch系统是ARM64架构&#xff0c;返回 aarch64。系统是ARM32架构&#xff0c;它会返回 armv7l 或类似的值。 使用 uname 命令&#xff1a; 确认系统架构的方法是使用 uname 命令 uname -a这会显示系统的详…

C现代方法(第11章)笔记——指针

文章目录 第11章 指针11.1 指针变量11.1.1 指针变量的声明 11.2 取地址运算符和间接寻址运算符11.2.1 取地址运算符11.2.2 间接寻址运算符 11.3 指针赋值11.4 指针作为参数11.4.1 找出数组中的最大元素和最小元素11.4.2 用const保护参数 11.5 指针作为返回值问与答写在最后 第1…

Derby数据库

创建数据库&#xff0c;并与数据库创建连接 connect jdbc:derby:firstdb;createtrue; 下次连接数据库时&#xff0c;可以不用“createtrue” 参数中 jdbc:derby 是 Derby 数据库的驱动协议&#xff1b; firstdb 是数据库 名称&#xff0c;由于没有指定路径&#xff0c;数据库…

C++之前置声明

在C中&#xff0c;前置声明是一种声明类或函数的方式&#xff0c;但并不定义它们。 前置声明的主要目的是为了解决编译时的依赖性问题&#xff0c;提高编译效率&#xff0c;并允许更灵活的代码组织。 原理 C前置声明可以减少头文件依赖的原理在于&#xff0c;通过前置声明&am…

java项目运行时信息获取

大体思路如下&#xff0c;想要获取启动时处理器数量、jvm 相关信息&#xff0c;操作系统信息、运行机器信息 运行机器信息 import org.slf4j.Logger; import org.slf4j.LoggerFactory;import java.lang.invoke.MethodHandles;/*** 机器工具类*/ public abstract class ServerU…

打造自己的前端组件库(奶妈版,超详细)

打造自己的前端组件库 demo是开源的&#xff0c;自己上npm 或者 github 上都能搜到 新建vue项目(sass js vue2) vue create yt-ui 修改文件目录(如下) 修改&#xff1a; 1.src 更名 examples; 2. src/components移动到项目最外层&#xff1b;3.vue.config.js更改入口文件 /…