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

  • 相对路径:项目 的 根目录 开始查找。( 但是在我们真正开发的时候,我们读到的更多的文件并不是直接放在我们项目里面这个文件夹里面,而是放在我们模块里面 )
  • 同理可得,我们直接创建 文件 b.txt 会在项目的根目录下创建文件
java 复制代码
        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
java 复制代码
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;
}
相关推荐
就叫_这个吧3 天前
理解Java反射机制和内省机制应用与实践
java·开发语言·反射
段ヤシ.5 天前
回顾Java知识点,面试题汇总Day18(持续更新)
java·网络编程·反射
雪碧聊技术7 天前
在切面日志记录中,如何使用多态代替反射来获取controller接口入参的属性值?一文详解
多态·反射·日志记录·切面编程
带刺的坐椅8 天前
一行代码干翻 Java 反射?EggG 流式反射调用让反射优雅到不可思议
java·反射·类型元数据·eggg
一条泥憨鱼9 天前
深入理解Java反射(超详细)
java·开发语言·spring·mybatis·反射
带刺的坐椅10 天前
Java 泛型解析太痛苦?你可能需要一枚「蛋」
java·反射·泛型·调用·类型元数据
吴声子夜歌19 天前
Java——反射
java·反射
青山师1 个月前
Java反射深度解析:运行时探查的艺术、代价与工程实践
java·开发语言·面试·反射·java程序员·java核心
月落归舟1 个月前
JAVA基础之反射
java·反射
千里马-horse1 个月前
gRPC -- Guides -- Reflection
grpc·反射