给出一个资源路径,然后获取资源文件的信息,可以说是非常常见的一种需求场景了,当然划分一下,本文针对最常见的三种状况进行分析

  • 网络地址
  • 本地绝对路径
  • 本地相对路径

I. 实现

1. 思路

http or no-http

给出一个String表示资源文件的标识,如何判断是网络的文件还是本地的文件?

  • http开头的看成是网络文件
  • 否则看做是本地文件

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
/**
* 是否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;
}

绝对路径与否判断

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()) {
// 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);
}

文件获取封装类

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. 其他

1. 一灰灰Bloghttps://liuyueyi.github.io/hexblog

一灰灰的个人博客,记录所有学习和工作中的博文,欢迎大家前去逛逛

2. 声明

尽信书则不如,已上内容,纯属一家之言,因个人能力有限,难免有疏漏和错误之处,如发现bug或者有更好的建议,欢迎批评指正,不吝感激

3. 扫描关注

一灰灰blog

QrCode

知识星球

goals