Skip to content

java读取jar包中资源文件-java.io.FileNotFoundException

背景

最近同事在写一个解析程序的时候,需要读取一个资源库文件,本地测试无问题,但在服务器运行时候却报错,找不到文件。

异常信息

java.io.FileNotFoundException: class path resource [phone.dat] cannot be resolved to absolute file path because it does not reside in the file system: jar:file://xxxxxx.jar!/BOOT-INF/classes!/phone.dat

原因分析

在开发过程中访问的是resources文件夹下的文件,访问路径格式为classpath:fileName,通过IDE运行能正确运行,而在服务器中运行时却报错。

原因

通过IDE编译后是以文件夹形式运行,而不是jar包,所以classpath所指向的地址为对应编译的文件夹,而jar包形式运行的时候,文件系统能访问的也就是jar就结束,无法直接访问jar包内的资源文件.

解决问题

如果需要读取jar包中的资源文件则需要通过以下方式进行访问。

ClassPathResource cpr = new ClassPathResource("static/file.txt");
try {
    byte[] bdata = FileCopyUtils.copyToByteArray(cpr.getInputStream());
    }
    .....

或者

this.getClass().getResourceAsStream(path)
    .....

同时支持IDE与JAR包读取

    /**
     * 入口方法
     * @param fileName
     * @return
     */
    private static String getCriteriaFilePath(String fileName){
        String path;
        try{
            path = ResourceUtils.getFile(ResourceUtils.CLASSPATH_URL_PREFIX + fileName)
                    .getAbsoluteFile().getPath();
        }catch (FileNotFoundException e) {
            path = readFile(fileName);
        }
        return path;
    }

    /**
     *  
     * @param fileName
     * @return
     */
    private static String readFile(String fileName){
        String ret;
        try{
            ret = readJarFile(fileName);
        }catch (IOException e)
        {
            throw new RuntimeException("文件读取异常"+e.getMessage());
        }
        return ret;
    }

    /**
     *  读取jar包中的资源文件
     * @param fileName 文件名
     * @return 文件内容
     * @throws IOException 读取错误
     */
    private static String readJarFile(String fileName) throws IOException{
        BufferedReader in = new BufferedReader(
                new InputStreamReader(TestUtils.class.getClass().getResourceAsStream(fileName)));

        StringBuilder buffer = new StringBuilder();
        String line;
        while ((line = in.readLine()) != null)
        {
            buffer.append(line);
        }
        return buffer.toString();
    }
发表评论

电子邮件地址不会被公开。 必填项已用*标注