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

简介: 通常我们最多的场景是从本地资源中读取文件,这个时候我们经常需要注意的是相对路径、绝对路径问题;除了从本地获取文件之外,从网络中获取文件资源(如图片)也属于相对常见的场景,接下来我们封装一个工具类,可以支持以上各种类型的数据读取

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


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


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


  • 相对路径
  • 绝对路径
  • 用户根目录
  • 网络


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系统属性来处理
/**
 * 将用户目录下地址~/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则不分这个,上面判断的核心逻辑如下


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

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



相关文章
|
API
国外地区经纬度查询免费API接口教程
此接口用于查询国外地区的经纬度信息,支持POST和GET请求方式。需提供用户ID、用户KEY、省级名称及具体地点。返回数据包括地区名称(中英文)、国家代码及经纬度等详细信息。示例请求与响应数据详见文档。
880 29
|
数据采集 编解码 Java
解锁Hutool魔法箱:Java开发者不可错过的神奇工具集
解锁Hutool魔法箱:Java开发者不可错过的神奇工具集
899 0
|
Java 测试技术 开发工具
Java单元测试之IDEA自动生成测试类
每次对类的方法进行测试,都是手动创建一个Test测试类,然后编写同名的方法,每次这样都会很繁琐,IDEA开发工具提供了自动生成测试类的插件JUnitGenerator,接下来介绍该插件的安装与使用。
4475 0
Java单元测试之IDEA自动生成测试类
|
Java
Java实现图片格式转换(通过ImageIO)
Java实现图片格式转换(通过ImageIO)
1722 0
|
8月前
|
IDE Java 编译器
java编程最基础学习
Java入门需掌握:环境搭建、基础语法、面向对象、数组集合与异常处理。通过实践编写简单程序,逐步深入学习,打牢编程基础。
412 1
|
11月前
|
Java Apache 开发者
解决java.lang.IllegalArgumentException: Invalid uri由无效查询引起的问题
最后,当你修改代码以避免这个异常时,保持代码的整洁和可读性同样重要。注释你的代码,用意图清晰的方法名,并确保逻辑简单明了,这样在未来你或其他开发者需要时可以轻松地维护它。
1224 20
|
存储 SQL 关系型数据库
MySQL 中的回表是什么?
在 MySQL 中,“回表”是指通过二级索引查询时,因二级索引仅存储索引字段值和主键值,需再根据主键到聚簇索引查找完整行数据的过程。此操作涉及两次索引查找,可能增加 IO 消耗,影响性能。优化方法包括使用覆盖索引或联合索引,避免回表,提升查询效率。合理设计索引对高并发、大数据量场景下的数据库性能至关重要。
749 17
|
Java 开发者
修改JAR文件工具
本文介绍了一款名为JarEditor的IDEA插件,该插件允许用户直接对JAR包内的文件进行增删改查操作,无需先行解压。通过简单的安装与使用步骤,大大简化了传统上需要解压缩、反编译、重新编译及打包的过程。此外,JarEditor还支持对混淆过的JAR文件进行字节码级别的修改,并提供了强大的搜索功能,支持大小写、全词匹配和正则表达式搜索。对于开发者而言,这款插件无疑极大提高了处理JAR文件的效率和便捷性。
1430 14
【多线程面试题十六】、谈谈ReentrantLock的实现原理
这篇文章解释了`ReentrantLock`的实现原理,它基于Java中的`AbstractQueuedSynchronizer`(AQS)构建,通过重写AQS的`tryAcquire`和`tryRelease`方法来实现锁的获取与释放,并详细描述了AQS内部的同步队列和条件队列以及独占模式的工作原理。
【多线程面试题十六】、谈谈ReentrantLock的实现原理
|
算法 Java Linux
java制作海报四:java BufferedImage 转 InputStream 上传至OSS。png 图片合成到模板(另一个图片)上时,透明部分变成了黑色
这篇文章主要介绍了如何将Java中的BufferedImage对象转换为InputStream以上传至OSS,并解决了png图片合成时透明部分变黑的问题。
1053 1