211108-封装一个根据路径获取文件资源的工具类

文章目录
  1. 一灰灰的联系方式

通常我们最多的场景是从本地资源中读取文件,这个时候我们经常需要注意的是相对路径、绝对路径问题;

除了从本地获取文件之外,从网络中获取文件资源(如图片)也属于相对常见的场景,接下来我们封装一个工具类,可以支持以上各种类型的数据读取

首先定义一个公共方法如下,内部支持四种方式的数据获取

  • 相对路径
  • 绝对路径
  • 用户根目录
  • 网络
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 new URL(fileName).openConnection().getInputStream();
} 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);
}
}

请注意上面的实现,绝对路径与相对路径比较好理解,用户目录,这个处理又是怎样的呢?

关键点在于,用户目录转绝对路径

  • 借助System.getProperties系统属性来处理
1
2
3
4
5
6
7
8
9
10
/**
* 将用户目录下地址~/xxx 转换为绝对地址
*
* @param path
* @return
*/
public static String parseHomeDir2AbsDir(String path) {
String homeDir = System.getProperties().getProperty("user.home");
return StringUtils.replace(path, "~", homeDir);
}

接下来再看如何判断一个路径是否为绝对路径呢?

这里需要格外注意不同操作系统的差异性,比如win,区分C盘,D盘,但是mac/linux则不分这个,上面判断的核心逻辑如下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
public static boolean isAbsFile(String fileName) {
if (OSUtil.isWinOS()) {
// windows 操作系统时,绝对地址形如 c:\descktop
return fileName.contains(":") || fileName.startsWith("\\");
} else {
// mac or linux
return fileName.startsWith("/");
}
}

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

除了上面的三种本地资源获取之外,还有一个就是网络资源的读取,上面介绍的实现姿势主要是基于JDK原生的URL,在实际使用时,这个并不稳定,不能确定能获取到完整的数据,原则上不推荐使用;如果可以,使用http-client/okhttp都是不错的选择

最后给一个简单的测试

最后一个简单下载图片的case

1
2
3
String img = "https://c-ssl.duitang.com/uploads/item/201809/16/20180916175034_Gr2hk.thumb.1000_0.jpeg";
BufferedImage pic = ImageIO.read(FileReadUtil.getStreamByFileName(img));
System.out.println(pic);

image.png

一灰灰的联系方式

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

QrCode

# Java

评论

Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×