Java根据路径获取文件内容的三种场景分析

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

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


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


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,有待验证




相关文章
|
5天前
|
监控 Java 应用服务中间件
高级java面试---spring.factories文件的解析源码API机制
【11月更文挑战第20天】Spring Boot是一个用于快速构建基于Spring框架的应用程序的开源框架。它通过自动配置、起步依赖和内嵌服务器等特性,极大地简化了Spring应用的开发和部署过程。本文将深入探讨Spring Boot的背景历史、业务场景、功能点以及底层原理,并通过Java代码手写模拟Spring Boot的启动过程,特别是spring.factories文件的解析源码API机制。
16 2
|
8天前
|
存储 缓存 安全
在 Java 编程中,创建临时文件用于存储临时数据或进行临时操作非常常见
在 Java 编程中,创建临时文件用于存储临时数据或进行临时操作非常常见。本文介绍了使用 `File.createTempFile` 方法和自定义创建临时文件的两种方式,详细探讨了它们的使用场景和注意事项,包括数据缓存、文件上传下载和日志记录等。强调了清理临时文件、确保文件名唯一性和合理设置文件权限的重要性。
23 2
|
17天前
|
存储 安全 Java
如何保证 Java 类文件的安全性?
Java类文件的安全性可以通过多种方式保障,如使用数字签名验证类文件的完整性和来源,利用安全管理器和安全策略限制类文件的权限,以及通过加密技术保护类文件在传输过程中的安全。
|
19天前
|
存储 Java API
Java实现导出多个excel表打包到zip文件中,供客户端另存为窗口下载
Java实现导出多个excel表打包到zip文件中,供客户端另存为窗口下载
25 4
|
18天前
|
存储 Java 关系型数据库
在Java开发中,数据库连接是应用与数据交互的关键环节。本文通过案例分析,深入探讨Java连接池的原理与最佳实践
在Java开发中,数据库连接是应用与数据交互的关键环节。本文通过案例分析,深入探讨Java连接池的原理与最佳实践,包括连接创建、分配、复用和释放等操作,并通过电商应用实例展示了如何选择合适的连接池库(如HikariCP)和配置参数,实现高效、稳定的数据库连接管理。
36 2
|
21天前
|
Java 数据格式 索引
使用 Java 字节码工具检查类文件完整性的原理是什么
Java字节码工具通过解析和分析类文件的字节码,检查其结构和内容是否符合Java虚拟机规范,确保类文件的完整性和合法性,防止恶意代码或损坏的类文件影响程序运行。
|
21天前
|
Java API Maven
如何使用 Java 字节码工具检查类文件的完整性
本文介绍如何利用Java字节码工具来检测类文件的完整性和有效性,确保类文件未被篡改或损坏,适用于开发和维护阶段的代码质量控制。
|
19天前
|
Java 关系型数据库 数据库
面向对象设计原则在Java中的实现与案例分析
【10月更文挑战第25天】本文通过Java语言的具体实现和案例分析,详细介绍了面向对象设计的五大核心原则:单一职责原则、开闭原则、里氏替换原则、接口隔离原则和依赖倒置原则。这些原则帮助开发者构建更加灵活、可维护和可扩展的系统,不仅适用于Java,也适用于其他面向对象编程语言。
13 2
|
Java 大数据 Apache