场景:最近做了一个swing项目,有一个功能是通过用户配置的内容动态创建html页面,此时我将css,js等样式文件放到src目录下,常规的方法直接运行程序没有问题,但是打包成jar包后出现无法复制jar包内的资源文件到外部的情况。现已通过以下方法处理,还没有想到更好的办法
1.我写了一个file.list的文件目录,里面包含了需要复制的资源文件的相对路径
private static void printFile(File file) { // 如果是目录 if (file.isDirectory()) { File[] files = file.listFiles(); // 遍历目录下的全部文件 for (File temp : files) { printFile(temp); } }else{ System.out.println(file.getAbsolutePath()); } }
2.IO流读取这个目录文件再一个个复制到外部,使用的是getResourceAsStream方法,这里要用buff的方式否则会出现文本最后出现乱码的问题
String apiFileListString = propertiesUtil.readProperty("api"); String[] fileList = apiFileListString.split(","); if (fileList != null && fileList.length > 0) { for (String filePath : fileList) { InputStream inputStream = IOUtil.class.getResourceAsStream(filePath); filePath = filePath.replace("/resources", ""); String newFileString = folderPath + filePath; createFile(newFileString, true); FileOutputStream outputStream = null; try { outputStream = new FileOutputStream(new File(newFileString),false); byte buff[] = new byte[1024]; int len = 0; while(0<=(len=inputStream.read(buff))){ outputStream.write(buff, 0, len); } outputStream.flush(); } catch (FileNotFoundException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } finally { if (outputStream != null) { try { outputStream.close(); } catch (IOException e) { e.printStackTrace(); } } if (inputStream != null) { try { inputStream.close(); } catch (IOException e) { e.printStackTrace(); } } } } }
private static boolean createFile(String destFileName) { return createFile(destFileName, false); } private static boolean createFile(String destFileName, boolean onlyFolder) { File file = new File(destFileName); if (file.exists()) { String msg = "创建单个文件" + destFileName + "失败,目标文件已存在!"; logger.debug(msg); return false; } if (destFileName.endsWith(File.separator)) { String msg = "创建单个文件" + destFileName + "失败,目标文件不能为目录!"; logger.error(msg); return false; } // 判断目标文件所在的目录是否存在 if (!file.getParentFile().exists()) { // 如果目标文件所在的目录不存在,则创建父目录 logger.error("目标文件所在目录不存在,准备创建它!"); if (!file.getParentFile().mkdirs()) { logger.error("创建目标文件所在目录失败!"); return false; } } if (!onlyFolder) { // 创建目标文件 try { if (file.createNewFile()) { logger.debug("创建单个文件" + destFileName + "成功!"); return true; } else { logger.error("创建单个文件" + destFileName + "失败!"); return false; } } catch (IOException e) { e.printStackTrace(); logger.error("创建单个文件" + destFileName + "失败!" + e.getMessage()); return false; } } return true; }
3.通过读filelist.properties中的路径列表 ,一个个文件通过IO流复制到外部。
filelist.properties:
api=/resources/api/others/css/bg.png,/resources/api/others/css/c5.css,/resources/api/others/css/favicon.ico,/resources/api/others/js/jquery.min.js,/resources/api/others/js/main.js