给出一个资源路径,然后获取资源文件的信息,可以说是非常常见的一种需求场景了,当然划分一下,本文针对最常见的三种状况进行分析
- 网络地址
- 本地绝对路径
- 本地相对路径
I. 实现
1. 思路
http or no-http
给出一个String表示资源文件的标识,如何判断是网络的文件还是本地的文件?
- http开头的看成是网络文件
- 否则看做是本地文件
abs or relaitve
对于mac和linux系统而言,就比较简单了
- 以 "/" 和 "~" 开头的表示绝对路径
- 其他的看做是相对路径
对于windows系统而言,绝对路径形如 "c:\test.txt"
- 路径中包含 ":" 看成是绝对路径 (文件名中能否有:?)
- 以 "" 开头看做是绝对路径
2. 实现
操作系统判断
/** * 是否windows系统 */ 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; } 复制代码
绝对路径与否判断
public static boolean isAbsFile(String fileName) { if (OSUtil.isWinOS()) { // windows 操作系统时,绝对地址形如 c:\descktop return fileName.contains(":") || fileName.startsWith("\\"); } else { // mac or linux return fileName.startsWith("/"); } } /** * 将用户目录下地址~/xxx 转换为绝对地址 * * @param path * @return */ public static String parseHomeDir2AbsDir(String path) { String homeDir = System.getProperties().getProperty("user.home"); return StringUtils.replace(path, "~", homeDir); } 复制代码
文件获取封装类
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,有待验证