gpt4 book ai didi

java - 使用 getResourceAsStream 从 JAR 或文件系统加载资源

转载 作者:行者123 更新时间:2023-12-03 05:20:03 30 4
gpt4 key购买 nike

我正在尝试制作一个简单的 Http 服务器。

但是我有一个小问题。

如果我的 /www 目录位于 .jar 文件编译中,则一切都很完美:代码:

private static final String DEFAULT_FILES_DIR = "/www";
....
private String getURLFromHeader(String header) {
//gettint url from header
....
return DEFAULT_FILES_DIR + url;
}
....
System.out.println("Resources: " + url + "\n");
System.out.println("Result code: " + code + "\n");

对于index.html,我变成: 资源:/www/index.html 结果代码:200 -> 一切正常。

但是当我这样做时:

private static final String DEFAULT_FILES_DIR = "D:/.../.../.../www"; // absolute pass;
....
....

服务器说“不,我不知道你不想从我这里得到什么”! =)并输入:资源:D:/.../.../.../www/index.html 结果代码:404 -> 找不到文件。

它可能是什么?

P.s.我尝试将 private static Final String DEFAULT_FILES_DIR = "D:\\...\\...\\...\\www"; 但它不起作用!))) )

最佳答案

您正在使用Class.getResourceAsStream()加载资源。这使用类加载器来加载资源,并且只能加载当前类路径内的路径。它无法加载任意本地文件。

您应该做的是对类路径中的资源使用 Class.getResourceAsStream() ,并对文件系统中的资源使用基本的 FileInputStream

您必须有一种方法来区分两者。具体如何实现取决于您的要求。您有很多选择,其中一些是:

  • 尝试使用 getResourceAsStream() 加载,如果失败,则使用 FileInputStream。这有点草率,但可能对你有用。需要注意的是,当您打算加载资源时,如果资源路径无意中不正确但与本地文件匹配,则您将面临错误加载本地文件的风险。
  • 将以“D:”开头的字符串视为文件。这也有点草率,可能会使其他位置或相对文件路径中的文件处理变得复杂,但它非常简单并且可能适用于您的应用程序。
  • 使用格式正确的 java.net.URL,如果方案类型为"file",则将其视为本地文件。
  • 将其抽象为您根据提前知道的资源类型构建的一些资源加载器接口(interface)。例如(按照您认为合适的方式处理异常):

    interface ResourceLoader { 
    public InputStream getInputStream ();
    }

    class ClassResourceLoader implements ResourceLoader {
    private final String resource;
    public ClassResourceLoader (String resource) {
    this.resource = resource;
    }
    @Override public InputStream getInputStream () {
    return HttpServer.class.getResourceAsStream(resource);
    }
    }

    class FileResourceLoader implements ResourceLoader {
    private final String resource;
    public FileResourceLoader (String resource) {
    this.resource = resource;
    }
    @Override public InputStream getInputStream () {
    try {
    return new FileInputStream(resource);
    } catch (Exception x) {
    return null;
    }
    }
    }

    private ResourceLoader getResourceLoaderFromHeader (String header) {
    return ...; // whatever is appropriate.
    }

您有很多选择,但要点是:您无法使用 Class.getResourceAsStream() 加载本地文件资源,并且您必须以不同的方式处理这两种情况。看看合适。

关于java - 使用 getResourceAsStream 从 JAR 或文件系统加载资源,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19797786/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com