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();
        }
    }
}
相关推荐
yuniko-n13 小时前
【Java】字符串相关坑点
java·开发语言·python
Terra.K13 小时前
Spring AI day1(SSE+AI)
java·人工智能·spring·springai
斑鸠喳喳13 小时前
线程本地存储 ThreadLocal
java·后端
Wang's Blog13 小时前
Java框架 SpringCloud 快速入门: 服务拆分案例 Demo
java·开发语言·spring cloud
DongQiShanRen14 小时前
裁决台账双向互校(上):名册与实物的第一道对账
java·linux·运维·数据库·人工智能·自然语言处理·数据挖掘
cpolar技术支持14 小时前
Spring Boot 接口本地正常,异地前端却报跨域?用 cpolar 跑通 CORS 预检与白名单
java·springboot·cpolar·前后端分离·cors
wuminyu15 小时前
Virtual Thread重投递至ForkJoinPool任务队列过程解析
java·linux·c语言·jvm·c++
小蒜学长15 小时前
在线保险服务与管理平台的设计与实现(代码+数据库+LW)
java·数据库·spring boot·后端·服务平台·在线保险
掉进电商坑三年没爬出来的东叔15 小时前
青龙面板进阶:一个面板聚合多平台签到,所有积分自动领
java·开发语言
殷色玫瑰16 小时前
C++ STL:stack、queue、priority_queue 与容器适配器详解
java·开发语言·数据结构·c++·算法·visualstudio