Arhn - архитектура программирования

Загрузка ресурса из JAR или файловой системы с помощью getResourceAsStream

Я пытаюсь сделать простой 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 -> файл не найден.

Что это может быть?

P.S. Пробовал ставить private static final String DEFAULT_FILES_DIR = "D:\\...\\...\\...\\www"; но не получилось!))))

05.11.2013

  • Можете ли вы показать нам, как вы пытаетесь получить доступ к этому ресурсу? Также имя вашего метода подразумевает, что он должен возвращать URL-адрес, но D:\... не является допустимым URL-адресом. URL-адреса файлов начинаются со схемы file://. Вы можете работать с java.net.URL вместо String, чтобы обеспечить правильную семантику. 06.11.2013
  • getURLFromHeader() возвращает строку (url) со значением по умолчанию dir_url + file_url. этот url переходит в другой метод, чем в: InputStream stream = HttpServer.class.getResourceAsStream(**url**); и проверяет: int code = (stream != null) ? 200 : 404;. Или что вы хотите увидеть? Могу показать полный код, если надо. 06.11.2013

Ответы:


1

Вы используете 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(), и вам придется обрабатывать два случая по-разному, любым способом, который вы считаете нужным.

05.11.2013
Новые материалы

Коллекции публикаций по глубокому обучению
Последние пару месяцев я создавал коллекции последних академических публикаций по различным подполям глубокого обучения в моем блоге https://amundtveit.com - эта публикация дает обзор 25..

Представляем: Pepita
Фреймворк JavaScript с открытым исходным кодом Я знаю, что недостатка в фреймворках JavaScript нет. Но я просто не мог остановиться. Я хотел написать что-то сам, со своими собственными..

Советы по коду Laravel #2
1-) Найти // You can specify the columns you need // in when you use the find method on a model User::find(‘id’, [‘email’,’name’]); // You can increment or decrement // a field in..

Работа с временными рядами спутниковых изображений, часть 3 (аналитика данных)
Анализ временных рядов спутниковых изображений для данных наблюдений за большой Землей (arXiv) Автор: Рольф Симоэс , Жильберто Камара , Жильберто Кейрос , Фелипе Соуза , Педро Р. Андраде ,..

3 способа решить квадратное уравнение (3-й мой любимый) -
1. Методом факторизации — 2. Используя квадратичную формулу — 3. Заполнив квадрат — Давайте поймем это, решив это простое уравнение: Мы пытаемся сделать LHS,..

Создание VR-миров с A-Frame
Виртуальная реальность (и дополненная реальность) стали главными модными терминами в образовательных технологиях. С недорогими VR-гарнитурами, такими как Google Cardboard , и использованием..

Демистификация рекурсии
КОДЕКС Демистификация рекурсии Упрощенная концепция ошеломляющей О чем весь этот шум? Рекурсия, кажется, единственная тема, от которой у каждого начинающего студента-информатика..