【问题标题】:Read a file in Java from classpath, absolute path, relative path that includes "../.." path从类路径、绝对路径、包含“../..”路径的相对路径中读取 Java 文件
【发布时间】:2018-12-11 01:54:48
【问题描述】:

在将此标记为重复之前,请阅读!我已经在 SO 和其他存储库中搜索了此解决方案。

如果 filepath 是绝对路径 file://some/path 或者如果它是 Classpath /some/class/path 中的路径,则以下 Spring API 有效。但是,此 API 无法处理包含“../”的相对路径。

File f = new DefaultResourceLoader().getResource(filepath).getfile();

如果上述失败,我一直在通过回退到下面来解决这个问题 -

File f = new File(filepath)

有没有办法避免这种回退逻辑并使用与文件路径无关的文件 API?

我遇到的另一个解决方案建议使用 getClass().getResource() 也需要后备 API 来处理绝对/相对路径。

【问题讨论】:

  • 当类路径无法处理相对路径时,您能给出一个完整的示例类路径吗?
  • 您是在谈论将资源从 sibling 路径加载到类路径上的路径吗?资源路径不是磁盘上位置的“真实”路径——资源只能从类路径条目下的路径加载。如果您想对磁盘上的任意位置执行 IO,则不能使用资源加载 API。相反,只需直接构造一个File 对象。
  • 我感兴趣的相对路径不在类路径中。它与当前目录相关,但不是从当前目录访问子目录中的文件的典型示例,而是我试图从父目录访问文件(例如)。资源 API 适用于绝对路径,javadocs 并未声明它们不适用于相对路径。无论如何,如果没有其他解决方案,我会坚持我目前的方法。谢谢
  • 我不太了解 Spring 如何确定事情,但在正常的 Java 用语中,“资源”是指相对于类路径条目命名的字节流。类加载空间是一种“虚拟文件系统”,它可以由磁盘上的真实文件、JAR 或 WAR 存档中的文件、甚至更深奥的东西(如从远程 URL 加载的 JAR 文件)支持。因此,处理资源的 API 并不是为处理加载“文件系统”的类之外的事情而设计的,我想这正是您遇到的限制。

标签: java


【解决方案1】:
File absolute = new File(filepath).getAbsoluteFile();

并进一步使用效果好的方法:

如果文件路径是绝对路径,则以下 Spring API 有效 文件://一些/路径

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-06-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多