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();
        }
    }
}
相关推荐
街头便衣11 分钟前
OpenRouter周榜复算:164万亿token,输出2.55%,DeepSeek账单占1.4%
android·java·开发语言·人工智能·语言模型·开源
mister_guo15 分钟前
Spring Boot 配置文件读取的几种方式:用法、原理与常见误区
java·spring boot
余槐i16 分钟前
虚拟线程上线后吞吐反而掉了:Spring Boot 3 里 synchronized 锁住载体线程的定位与修复
java·spring boot·性能优化·虚拟线程·jdk 21
要开心吖ZSH19 分钟前
DDD(领域驱动设计)篇三:实战对照——同一个订单业务,两种架构怎么写
java·架构·领域模型·ddd·领域驱动设计·设计思想
wangchunyu11410 小时前
JAVA CompletableFuture异步编程实战
java·开发语言·python
paopaokaka_luck11 小时前
流浪动物救助与收养系统(DeepSeek AI对话、 ECharts多维分析、救助流程衔接、领养与回访衔接、 捐赠确认与公示、志愿者协作)
java·前端·javascript·人工智能·mysql·echarts·推荐算法
Thomas.Sir11 小时前
第9课:SpringBoot4.x Web开发基础:WebMvc自动配置、静态资源、请求参数接收
java·spring boot
程序 代码狂人11 小时前
切片表与分区表的区别(数据开发面试版)
java·大数据·开发语言·数据仓库·算法
2501_9445215912 小时前
Deepmerge 跨端三方库仓颉适配全流程
java·python·eclipse·github
南归北隐13 小时前
Spring AI Alibaba Graph框架实现MCP数据库查询实战
java·后端·spring ai·mcp·spring ai mcp