2

我正在尝试制作一个简单的 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,我变成:Resources: /www/index.html Result code: 200-> 一切正常。

但是当我这样做时:

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

服务器说“不,我不知道你不会从我这里得到什么”!=) 并输入:Resources: D:/.../.../.../www/index.html Result code: 404-> 找不到文件。

它可以是什么?

Ps 我试图把private static final String DEFAULT_FILES_DIR = "D:\\...\\...\\...\\www";它,但它不会工作!))))

4

1 回答 1

9

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

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

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

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

    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()并且您必须以您认为合适的任何方式以不同的方式处理这两种情况。

于 2013-11-05T20:32:42.463 回答