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

  • 相对路径:项目 的 根目录 开始查找。( 但是在我们真正开发的时候,我们读到的更多的文件并不是直接放在我们项目里面这个文件夹里面,而是放在我们模块里面 )
  • 同理可得,我们直接创建 文件 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;
}
相关推荐
楠枬4 天前
Java 反射
java·开发语言·反射
scimence10 天前
C# 反射,修改变量值(示例)
c#·反射·reflect·反射修改变量值·fieldinfo
G皮T18 天前
【Java】Java 的反射机制(三):反射的实际运用
java·注解·反射·reflection
程序猿小D2 个月前
第二百一十六节 JSF教程 - JSF基本标签、JSF表单文本框示例
java·开发语言·jvm·jdk·反射·jsf
程序研2 个月前
JAVA如何使用反射读取注解
java·开发语言·后端·反射
码农研究僧3 个月前
详细分析Java中的SPI机制(附Demo)
java·服务发现·反射·spi·动态加载
类人_猿4 个月前
C#中类的反射以及调用小妙招
c#·反射·代码优化·getmethod·type.gettype
martian6654 个月前
学懂C#编程:常用高级技术——学会C#的高级特性 反射
开发语言·c#·反射·高级特性
。。。。。964 个月前
Java反射详细总结
java·开发语言·反射·reflect
JellyfishMIX5 个月前
获取泛型,泛型擦除,TypeReference 原理分析
jvm·反射·字节码·java泛型