• [Java] 在 jar 文件中读取 resources 目录下的文件


    注意两点:

    1. 将资源目录添加到 build path,确保该目录下的文件被拷贝到 jar 文件中。

    2. jar 内部的东西,可以当作 stream 来读取,但不应该当作 file 来读取。

    例子

    新建一个 maven 目录

    App.java 用于读取 resources 中的 a.txt 内容。

    a.txt 是被读取的资源文件。

    grs@grs App $ tree
    .
    ├── pom.xml
    ├── src
    │   ├── main
    │   │   ├── java
    │   │   │   └── tony
    │   │   │       └── App
    │   │   │           └── App.java
    │   │   └── resources
    │   │       └── a.txt


    把资源目录添加到 build path 中

    项目右击 -> properties -> Java Build Path -> Source -> 把 resources 目录添加到 build path 中。

    如果没有添加到 build path 中,导出为一个 Runnable JAR 文件后,运行会报错 Exception in thread "main" java.lang.NullPointerException,解压 jar 后会发现,a.txt 文件没有存在于 jar 文件中。

    把 resources 加入到 build path ,使得 resources 目录的文件被包含在 jar 的内部首层路径中。解压 jar ,目录结构如下:

    grs@grs app.jar $ tree
    .
    ├── META-INF
    │   └── MANIFEST.MF
    ├── a.txt
    └── tony
        └── App
            └── App.class

    代码实现

    将 resources 目录设置为 build path 后, a.txt 文件被拷贝到 jar 的首层,所以采用 /a.txt 路径读取。采用 stream 方式读取,确保能读到打包成 jar 内部资源的文件。

    package tony.App;
    
    import java.io.IOException;
    import java.io.InputStream;
    
    public class App 
    {
        public static void main( String[] args ) throws Exception
        {
            System.out.println( "Hello World! --- " );
            App app = new App();
            app.readResources();
        }
        
        public void readResources() throws IOException{
            InputStream is = this.getClass().getResourceAsStream("/a.txt");
            System.out.println((char)is.read());
            is.close();
        }
    }
  • 相关阅读:
    APP 元素定位总结(未完待补充)
    vue-axios常见请求配置和全局设置
    vue-axios发送并发请求
    vue-axios基本使用
    vue-vuex-store目录结构
    vue-vuex-modules的基本使用
    vue-vuex-actions的基本使用
    vue-vuex-mutations的类型常量
    vue-vuex-state响应式
    vue-vuex-mutation的提交风格
  • 原文地址:https://www.cnblogs.com/TonyYPZhang/p/6298422.html
Copyright © 2020-2023  润新知