读取jar内指定文件夹中所有文件信息

在我们日常开发过程中会经常遇到通过模板生成文件的业务场景,但是模板可能会经常发生改变,所以我们使用以下代码实现对文件的读取:

private static List<String> loadFiles(String basePath, String fileType, List<String> lst) {
        URL resource = FileUitls.class.getClassLoader().getResource(basePath);
        if (resource == null) {
            return lst;
        }
        File file = new File(resource.getFile());
         if (file.isDirectory()) {
             // 如果当前文件是文件夹 那么获取下面所有的文件
             String[] list = file.list();
             for (String s : list) {
                 loadFiles(basePath + "/" + s, fileType, lst);
             }
         } else if (file.isFile()) {
             if (isEmpty(fileType) || basePath.endsWith("." + fileType)) {
                 lst.add(basePath);
             }
         }
        return lst;
    }

但是当我们将写好的程序打成jar包提供给其它程序使用之后会发现,原本开发环境可以正常读取的文件都会消失,导致这个问题的原因是操作系统会将jar看作是一个文件 而不是一个目录结构,那么如果我们再通过new file的形式去读取jar内的肯定会出现问题。正确的姿势如下:

public class FileUitls{
	/** 
	 *读取指定文件夹下的指定类型的文件
	 * @param basePath 基础目录
	 * @param fileType 文件类型
	 * @param lst       存放目录的容器
	 */
	public static List<String> loadFiles(String basePath, String fileType, List<String> lst) {
	   URL resource = FileUitls.class.getClassLoader().getResource(basePath);
	    if (resource == null) {
	        return lst;
	    }
	    if ("jar".equals(resource.getProtocol())) {
	        //jar包读取
	        loadFilesInJar(basePath, fileType, lst);
	    } else {
	        File file = new File(resource.getFile());
	        if (file.isDirectory()) {
	            // 如果当前文件是文件夹 那么获取下面所有的文件
	            String[] list = file.list();
	            for (String s : list) {
	                loadFiles(basePath + "/" + s, fileType, lst);
	            }
	        } else if (file.isFile()) {
	            if (isEmpty(fileType) || basePath.endsWith("." + fileType)) {
	                lst.add(basePath);
	            }
	        }
	    }
	    return lst;
	}
	// 读取jar内的文件夹信息
	public static List<String> loadFilesInJar(String basePath, String fileType, List<String> lst) {
	    try {
	        ClassLoader classLoader = FileUitls.class.getClassLoader();
	        URL url = classLoader.getResource(basePath);
	        String urlStr = url.toString();
	        // 找到!/ 截断之前的字符串
	        String jarPath = urlStr.substring(0, urlStr.indexOf("!/") + 2);
	        URL jarURL = new URL(jarPath);
	        JarURLConnection jarCon = (JarURLConnection) jarURL.openConnection();
	        JarFile jarFile = jarCon.getJarFile();
	        Enumeration<JarEntry> jarEntrys = jarFile.entries();
	        while (jarEntrys.hasMoreElements()) {
	            JarEntry entry = jarEntrys.nextElement();
	            // 简单的判断路径,如果想做到像Spring,Ant-Style格式的路径匹配需要用到正则。
	            String name = entry.getName();
	            if (name.startsWith(basePath) && !name.equals(basePath)) {
	                if (entry.isDirectory()) {
	                    // 文件夹 迭代
	                    loadFilesInJar(name, fileType, lst);
	                } else if (!lst.contains(name)) {
	                    if (isEmpty(fileType) || name.endsWith("." + fileType)) {
	                        lst.add(name);
	                    }
	                }
	            }
	        }
	    } catch (IOException e) {
	        throw new RuntimeException(e);
	    }
	    return lst;
	}
	
	// 读取指定文件信息
	public static String loadFile(String fileName) {
	    URL resource = FileUitls.class.getClassLoader().getResource(fileName);
	    if (resource == null) {
	        return "";
	    }
	    // 如果文件是jar 那么需要用jar的方式读取
	    if ("jar".equals(resource.getProtocol())) {
	        //jar包读取
	        return loadJarFile(fileName);
	    } else {
	        StringBuilder content = new StringBuilder();
	        FileInputStream fr = null;
	        try  {
	            fr =new FileInputStream(resource.getFile());
	            byte[] bytes = new byte[1024];
	            int len = 0;
	            while ((len = fr.read(bytes)) > 0) {
	                content.append(new String(bytes, 0, len, StandardCharsets.UTF_8));
	            }
	        } catch (IOException e) {
	            e.printStackTrace();
	        }finally {
	            closeIO(fr);
	        }
	        return content.toString();
	    }
	}
	
	// 读取jar包内的文件信息
	public static String loadJarFile(String fileName) {
        StringBuilder content = new StringBuilder();
        InputStream fr = FileUitls.class.getClassLoader().getResourceAsStream(fileName);
        try {
            byte[] bytes = new byte[1024];
            int len = 0;
            while ((len = fr.read(bytes)) > 0) {
                content.append(new String(bytes, 0, len, StandardCharsets.UTF_8));
            }
        } catch (IOException e) {
            e.printStackTrace();
        }finally {
            closeIO(fr);
        }
        return  content.toString();
    }
}
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值