给出一个资源路径,然后获取资源文件的信息,可以说是非常常见的一种需求场景了,当然划分一下,本文针对最常见的三种状况进行分析
I. 实现 1. 思路 http or no-http
给出一个String表示资源文件的标识,如何判断是网络的文件还是本地的文件?
abs or relaitve
对于mac和linux系统而言,就比较简单了
以 “/“ 和 “~” 开头的表示绝对路径
其他的看做是相对路径
对于windows系统而言,绝对路径形如 “c:\test.txt”
路径中包含 “:” 看成是绝对路径 (文件名中能否有:?)
以 “\” 开头看做是绝对路径
2. 实现 操作系统判断
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 public static boolean isWinOS () { boolean isWinOS = false ; try { String osName = System.getProperty("os.name" ).toLowerCase(); String sharpOsName = osName.replaceAll("windows" , "{windows}" ).replaceAll("^win([^a-z])" , "{windows}$1" ) .replaceAll("([^a-z])win([^a-z])" , "$1{windows}$2" ); isWinOS = sharpOsName.contains("{windows}" ); } catch (Exception e) { e.printStackTrace(); } return isWinOS; }
绝对路径与否判断
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 public static boolean isAbsFile (String fileName) { if (OSUtil.isWinOS()) { return fileName.contains(":" ) || fileName.startsWith("\\" ); } else { return fileName.startsWith("/" ); } } public static String parseHomeDir2AbsDir (String path) { String homeDir = System.getProperties().getProperty("user.home" ); return StringUtils.replace(path, "~" , homeDir); }
文件获取封装类
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 public static InputStream getStreamByFileName (String fileName) throws IOException { if (fileName == null ) { throw new IllegalArgumentException("fileName should not be null!" ); } if (fileName.startsWith("http" )) { return HttpUtil.downFile(fileName); } else if (BasicFileUtil.isAbsFile(fileName)) { Path path = Paths.get(fileName); return Files.newInputStream(path); } else if (fileName.startsWith("~" )) { fileName = BasicFileUtil.parseHomeDir2AbsDir(fileName); return Files.newInputStream(Paths.get(fileName)); } else { return FileReadUtil.class .getClassLoader ().getResourceAsStream (fileName ) ; } }
3. 说明 木有window操作系统,因此mac和linux已测试,window环境下是否ok,有待验证
II. 其他 一灰灰的个人博客,记录所有学习和工作中的博文,欢迎大家前去逛逛
2. 声明 尽信书则不如,已上内容,纯属一家之言,因个人能力有限,难免有疏漏和错误之处,如发现bug或者有更好的建议,欢迎批评指正,不吝感激
3. 扫描关注 一灰灰blog
知识星球