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

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

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


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


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


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


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



相关文章
|
8月前
|
Java
Java实现文件和目录的管理
Java实现文件和目录的管理
105 0
|
2月前
|
IDE Java Maven
如何解决类路径问题
类路径问题通常出现在Java等编程语言中,解决方法包括:确保文件路径正确、使用相对路径、检查环境变量配置、利用构建工具(如Maven)管理依赖、清理和重新构建项目。
105 13
|
6月前
|
前端开发 JavaScript 安全
|
8月前
|
Java
如何解决使用若依前后端分离打包部署到服务器上后主包无法找到从包中的文件的问题?如何在 Java 代码中访问 jar 包中的资源文件?
如何解决使用若依前后端分离打包部署到服务器上后主包无法找到从包中的文件的问题?如何在 Java 代码中访问 jar 包中的资源文件?
709 0
|
Java 数据库连接 API
流程定义资源文件下载
流程定义资源文件下载
|
前端开发 小程序 PHP
laravel5.8(四)引入自定义常量文件及公共函数文件
开发过程中,我们一般会用到一些不会改变,或者改变不是很频繁的值,这样的值我们一般将他们定义成常量。 比如网站根目录,或者分页数,或者域名等等。 那我们如何在laravel5.8中引入自定义的常量文件及公共的函数文件呢。 大概有两种方式: 1:框架目录下引入(不推荐) 在框架目录vendor下新建常量文件const.php,以及公共函数文件function.php 在autoload.php文件中引入。 这种方法是可以的,但是不推荐,框架目录下最好都是框架自己的那些文件,正常来说,框架的文件我们在开发过程中,git是不会进行托管的。 2:在app目录下引入 在bootstrap目录下新建常量文件
77 0
java——获取项目根路径方式
java——获取项目根路径方式
|
存储 Java
Java实现文件上传到本地(自定义保存路径)
Java实现文件上传到本地(自定义保存路径)
835 0
|
Java Spring
JAVA读取绝对路径文件和项目类路径下的文件的方法
JAVA读取绝对路径文件和项目类路径下的文件的方法
1732 0
|
Java 应用服务中间件 Linux
springboot上传下载文件(1)(项目和文件资源放在同一个服务器上)
springboot上传下载文件(1)(项目和文件资源放在同一个服务器上)
332 0