java中 如何从jar中读取资源文件?

在Java中,从JAR文件中读取资源文件通常使用类加载器(ClassLoader)或者通过getClass().getResourceAsStream()方法。以下是几种常见的方法:

方法一:使用 getClass().getResourceAsStream()

这是最常见和推荐的方法,因为它简单且易于理解。

java 复制代码
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;

public class ReadResourceFile {
    public static void main(String[] args) {
        // 假设资源文件名为 "config.properties",并且位于资源根目录
        String resourceName = "config.properties";
        
        // 使用类加载器获取资源文件的输入流
        try (InputStream inputStream = ReadResourceFile.class.getResourceAsStream(resourceName);
             BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream))) {

            if (inputStream == null) {
                System.out.println("Resource not found: " + resourceName);
                return;
            }

            String line;
            while ((line = reader.readLine()) != null) {
                System.out.println(line);
            }

        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

方法二:使用 ClassLoader.getResourceAsStream()

你也可以直接使用类加载器来获取资源文件的输入流。

java 复制代码
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;

public class ReadResourceFile {
    public static void main(String[] args) {
        // 假设资源文件名为 "config.properties",并且位于资源根目录
        String resourceName = "config.properties";
        
        // 获取当前类的类加载器
        ClassLoader classLoader = ReadResourceFile.class.getClassLoader();
        
        try (InputStream inputStream = classLoader.getResourceAsStream(resourceName);
             BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream))) {

            if (inputStream == null) {
                System.out.println("Resource not found: " + resourceName);
                return;
            }

            String line;
            while ((line = reader.readLine()) != null) {
                System.out.println(line);
            }

        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

方法三:使用 Files.readAllLines (Java 7+)

如果你使用的是Java 7或更高版本,并且资源文件是文本文件,可以使用java.nio.file.Files类来读取文件内容。不过,请注意,这种方法通常用于文件系统路径,而不是JAR中的资源路径。对于JAR中的资源,还是推荐使用前两种方法。

java 复制代码
import java.io.IOException;
import java.net.URISyntaxException;
import java.nio.file.Files;
import java.nio.file.Paths;
import java.util.List;

public class ReadResourceFile {
    public static void main(String[] args) {
        // 假设资源文件名为 "config.properties",并且位于资源根目录
        String resourceName = "/config.properties"; // 注意路径前的斜杠
        
        // 获取资源文件的URI
        try {
            List<String> lines = Files.readAllLines(Paths.get(ReadResourceFile.class.getResource(resourceName).toURI()));
            for (String line : lines) {
                System.out.println(line);
            }
        } catch (IOException | URISyntaxException e) {
            e.printStackTrace();
        }
    }
}
相关推荐
晴空月明2 小时前
线程安全与锁机制深度解析
java
天天摸鱼的java工程师3 小时前
你如何处理一个高并发接口的线程安全问题?说说你做过的优化措施
java·后端
Micro麦可乐4 小时前
最新Spring Security实战教程(十八)安全日志与审计:关键操作追踪与风险预警
java·spring boot·后端·安全·spring·安全审计
刘一说4 小时前
资深Java工程师的面试题目(六)数据存储
java·开发语言·数据库·面试·性能优化
江沉晚呤时4 小时前
EventSourcing.NetCore:基于事件溯源模式的 .NET Core 库
java·开发语言·数据库
考虑考虑4 小时前
JDK17中的Sealed Classes
java·后端·java ee
写bug写bug5 小时前
深入理解Unsafe类
java·后端
星垣矩阵架构师5 小时前
六.架构设计之存储高性能——缓存
java·spring·缓存
刃神太酷啦5 小时前
聚焦 string:C++ 文本处理的核心利器--《Hello C++ Wrold!》(10)--(C/C++)
java·c语言·c++·qt·算法·leetcode·github
TeamDev5 小时前
在 Java 应用中构建双向数据保护
java·前端框架·全栈