Проблемы с использованием Class.getResourceAsStream () в Java - PullRequest
12 голосов
/ 18 февраля 2010

Я немного застрял в проекте, над которым я работаю, где я хочу загрузить текстовый файл из другой папки. Я использую Netbeans, и для целей этой проблемы у меня есть две папки, одна с моим классом и одна с ресурсом.

Класс находится в ../misc/[ClassName], а текстовый файл, который я хочу загрузить, находится в ../resources/[Name].txt

Это звучит невероятно просто, и, занимаясь Java довольно долго, я действительно должен это знать, я предположил, что лучший способ загрузки этого файла вместо использования FileReader - использовать getResourceAsStream, как показано ниже:

InputStream is = 
        this.getClass().getClassLoader().getResourceAsStream(_filename + ".txt");

В идеале экономит мое время и не требует жесткого кода в пути к файлу. Теперь моя проблема в том, что я постоянно получаю нулевое значение, возвращаемое из приведенного выше кода, и любую другую перестановку, которую я могу добавить к нему. Я пробовал /resource/filename.txt или resource/filename.txt в качестве параметров, используя .getClass().getResourceAsStream вместо getClassLoader(), все по-прежнему возвращает тот же результат.

Просто, чтобы избежать путаницы, я проверил имя файла и оно определенно правильно, а также в правильном случае и т. Д., Так что это не проблема. Есть идеи? Я знаю, что мог бы просто использовать FileReader для достижения той же цели, но это своего рода принципиальная вещь сейчас!

Ответы [ 4 ]

13 голосов
/ 18 февраля 2010

Класс загружается другим загрузчиком классов, который вообще не знает о ресурсе. Вместо этого используйте контекст ClassLoader, полученный из текущего Thread. Он знает все.

InputStream is = Thread.currentThread().getContextClassLoader().getResourceAsStream(_filename + ".txt");
7 голосов
/ 18 февраля 2010

Я использую IntelliJ и обнаружил, что для меня характерно "забыть", что я забыл определить соответствующий шаблон ресурса для файлов .txt, .css и т. Д. Это означает, что при запуске процесса сборки эти файлы будут исключены изфайл jar, который он создает, в результате чего вызовы getResource() возвращают ноль.

Я подозреваю, что подобное происходит в вашей среде Netbeans, поэтому стоит проверить.

5 голосов
/ 08 октября 2010

У меня та же проблема, что и у Дэвида Медоуза,
она работает с 2008 года и никаких проблем. Прочитайте весь пост относительно getResourceAsStream( ) здесь. Моя проблема в том, что я могу прочитать некоторые файлы из файла JAR. Все png файлы могут быть прочитаны, но файлы wav нет. Странно, если я переименую файл .wav в .png. Файлы можно загружать и воспроизводить!

Когда я развертываю приложение, оно работает, может ли это быть как-то IntelliJ?

Примечание: Я знаю, что WAV-файлы есть, потому что их можно достать с JarFile и JarEntry.

Решение в intelliJ : В настройках проекта добавьте папку с файлами ресурсов, в моем случае звуковые файлы, в качестве источника. Добавить

? *. Wav (или ваш префил тип файла)

в Настройки-> Шаблоны ресурсов компилятора.

4 голосов
/ 18 февраля 2010

С чего начинается ваш путь к классам? Это начинается с misc или ..?

Можете ли вы опубликовать значение this.getClass().getName()?

Если возвращается misc.ClassName, вы должны использовать this.getClass().getResourceAsStream("/resources/filename.txt").

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