java -jar获取资源文件问题

在非jar环境下,可以正常获取resources的绝对路径并转换为File对象。但在jar环境下,由于jar被视为单一文件,无法直接获取正确路径。文章提出了解决方案,即通过getResourceAsStream获取InputStream,然后写入新建的本地文件进行操作,程序结束时可通过deleteOnExit自动删除临时文件。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

java -jar getResource 获取资源文件问题


    public void getResouceFile() {

        /*
         * 非java -jar方式运行,可以获得resources正确的绝对路径;
         * resourcesPath:D:/freemarker-demo/target/classes/templates/template.docx
         *
         * java -jar方式运行,不可以获得resources正确的绝对路径,因为jar是当做一个文件,而不是文件夹;
         * resourcesPath:file:/D:/freemarker-demo/target/freemarker-demo-1.0.jar!/BOOT-INF/classes!/templates/template.docx
         * */
        String resourcesPath = GetResourceFileTest.class.getResource("/templates/template.docx").getPath();
        System.out.println("resourcesPath:" + resourcesPath);

        /*
         * 非java -jar方式运行,可得到资源的正确绝对路径,所以可以通过new File()转成File对象;
         * resourcesFile:true
         *
         * java -jar方式运行,不可以获得resources正确的绝对路径,不可通过new File()转成File对象;
         * resourcesFile:false
         * */
        File resourcesFile = new File(resourcesPath);
        System.out.println("resourcesFile:" + resourcesFile.exists());

        /*
         * java -jar方式运行,
         * 不能用getResource方法(返回URL,再通过getPath获得绝对路径,再new File获得File对象),
         * 可以用getResourceAsStream方法(返回InputStream,再写入一个新建的File,由此获得File对象)
         *
         * getResourceAsStream有两种使用方式:
         * 1.TestClass.class.getResourceAsStream(String path);
         *      path开头不带"/",那么就是从当前class文件的路径下找文件
         *      path开头带"/",那么就是从类路径.classpath中去找文件
         * 2.TestClass.class.getClassLoader.getResourceAsStream(String path);
         *      path中不能带/,因为这个的意思就是在类路径classpath中去找文件
         *
         * 可以先通过new File()新建本地文件temp.docx或者createTempFile()新建本地文件temp10099794038854241516.docx,
         * 再将获取到的InputStream写入本地文件,之后就直接读取本地文件即可。
         *
         * 该本地文件只是为了copy出来临时使用,可以加templateFile.deleteOnExit();程序结束后会自动删除该本地文件,前提是该文件对应的IO流要close。
         * */
        File templateFile = new File("./temp.docx");
//        File templateFile = File.createTempFile("temp", ".docx", new File("."));
        try (
                InputStream templateFileInputStream = GetResourceFileTest.class.getResourceAsStream("/templates/template.docx");
                OutputStream outStream = new FileOutputStream(templateFile);
        ) {
            int bytesRead = 0;
            byte[] buffer = new byte[8192];
            while ((bytesRead = templateFileInputStream.read(buffer, 0, 8192)) != -1) {
                outStream.write(buffer, 0, bytesRead);
            }
        } catch (IOException e) {
            throw new RuntimeException(e);
        }
    }
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值