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




相关文章
|
14天前
|
消息中间件 前端开发 Java
java学习路径
【4月更文挑战第9天】java学习路径
17 1
|
28天前
|
Java
有关Java发送邮件信息(支持附件、html文件模板发送)
有关Java发送邮件信息(支持附件、html文件模板发送)
26 1
|
1月前
|
Java
java中替换文件内容
java中替换文件内容
14 1
|
1月前
|
Java API
Java中文件与输入输出
Java中文件与输入输出
|
1月前
|
Java
java实现遍历树形菜单方法——映射文件VoteTree.hbm.xml
java实现遍历树形菜单方法——映射文件VoteTree.hbm.xml
9 0
|
1月前
|
Java
java程序导出堆文件
java程序导出堆文件
|
13天前
|
Java 调度
Java中常见锁的分类及概念分析
Java中常见锁的分类及概念分析
15 0
|
14天前
|
设计模式 前端开发 安全
Java是一种广泛使用的编程语言,其学习路径可以大致分为以下几个阶段
【4月更文挑战第9天】Java是一种广泛使用的编程语言,其学习路径可以大致分为以下几个阶段
15 1
|
13天前
|
Java
Java中ReentrantLock中tryLock()方法加锁分析
Java中ReentrantLock中tryLock()方法加锁分析
12 0
|
2天前
|
Java 关系型数据库 MySQL
Elasticsearch【问题记录 01】启动服务&停止服务的2类方法【及 java.nio.file.AccessDeniedException: xx/pid 问题解决】(含shell脚本文件)
【4月更文挑战第12天】Elasticsearch【问题记录 01】启动服务&停止服务的2类方法【及 java.nio.file.AccessDeniedException: xx/pid 问题解决】(含shell脚本文件)
23 3