getResourceAsStream не работает для каждого класса? - PullRequest
4 голосов
/ 17 мая 2009

У меня есть JAR-файл, который использует некоторые текстовые файлы. Для их получения используется функция Class.getResourceAsStream.

Class A
{
    public InputStream getInputStream(String path) throws Exception {
        try {
            return new FileInputStream(path);
        } catch (FileNotFoundException ex) {
            InputStream inputStream = getClass().getResourceAsStream(path);
            if (inputStream == null)
                throw new Exception("Failed to get input stream for file " + path);
            return inputStream;
        }
    }
}

Этот код работает отлично.

Проблема в том, что если я определю класс A как extends java.io.File, InputStream, который я получаю из getResourceAsStream, будет нулевым.

Также, если я оставлю класс A как обычный класс (не унаследованный), и определю класс B как:

Class B extends java.io.File
{
    public InputStream getInputStream(String path) throws Exception
    {
     return new A().getInputStream(path);
 }
}

возвращенный InputStream по-прежнему равен нулю.

В чем проблема? Есть ли способ получить доступ к файлу из класса, который наследует File?

Спасибо

Ответы [ 4 ]

10 голосов
/ 17 мая 2009

Я подозреваю, что это больше связано с пакетами, чем с наследованием.

Если ваш класс находится в пакете, то getResourceAsStream() будет относительным к этому пакету, если вы не начнете его с "/" (что делает его "абсолютным" ресурсом). Альтернативой является использование getClass().getClassLoader().getResourceAsStream(), в котором отсутствует представление о пути относительно пакета.

Простое создание подклассов File не должно влиять на поведение. Если вы действительно в это верите, пожалуйста, опубликуйте короткую, но полную программу, чтобы продемонстрировать проблему.

4 голосов
/ 09 января 2011

Вот несколько примеров, подтверждающих объяснение Джона Скита:

Предпосылка: у вас есть класс my.package.A, который зависит от foo.txt.

  1. Если вы используете my.package.A.class.getResourceAsStream ("foo.txt") и помещаете файл foo.txt в my / package / foo.txt в вашем jar-файле, то при запуске класса A он должен найти foo.txt.

  2. если вы используете my.package.A.class.getClassLoader (). GetResourceAsStream ("foo.txt"), тогда поместите foo.txt в любую папку на пути к классам, когда вы запускаете класс A, он должен найти foo .txt.

  3. если вы используете my.package.A.class.getResourceAsStream ("/ foo.txt") и вы помещаете foo.txt в /foo.txt в моем jar-файле, то при запуске проекта A это должно произойти найти foo.txt.

1 голос
/ 17 мая 2009

ИМХО, все же лучше использовать getClass().getClassLoader().getResourceAsStream(), так как приведенный выше код может дать сбой, если вы создаете подкласс (а подкласс находится в другом пакете) и вызываете метод parent.

0 голосов
/ 17 мая 2009

Извините, проблема в другом. (На самом деле никаких проблем ...)

В классе, унаследованном от java.io.File, я использовал getPath(), чтобы получить путь к ресурсу. Но путь имел обратные косые черты вместо обычных косых черт (поскольку я работаю в ОС Windows). Когда я использовал обычные слэши, это работало даже при использовании унаследованного класса.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...