Проблемы с использованием Class.getResourceAsStream() в Java
Я немного застрял в проекте, над которым я работаю, где я хочу загрузить текстовый файл из другой папки. Я использую Netbeans и имею для этой цели две папки: одну с моим классом и один с ресурсом.
Класс находится в ../misc/[ClassName]
, а текстовый файл, который я хочу загрузить, находится в ../resources/[Name].txt
Это звучит невероятно просто, и, проделав Java довольно долго, я действительно должен это знать, я предположил, что лучший способ загрузки этого файла вместо использования только FileReader - использовать getResourceAsStream
, как показано:
InputStream is =
this.getClass().getClassLoader().getResourceAsStream(_filename + ".txt");
Идеальное сохранение времени и отсутствие жесткого кода в пути к файлу. Теперь, моя проблема в том, что я постоянно получаю null, возвращенный из приведенного выше кода, и даже любую другую перестановку, которую я могу наложить на нее. Я пробовал /resource/filename.txt
или resource/filename.txt
в качестве параметров, используя .getClass().getResourceAsStream
, а не getClassLoader()
, все еще возвращает тот же результат.
Просто, чтобы избежать путаницы, я проверил имя файла и его определенную правоту и в правильном случае и т.д., так что это не проблема. Есть идеи? Я знаю, что могу просто использовать FileReader
для достижения той же цели, но теперь это своего рода принцип!
Ответы
Ответ 1
Класс, очевидно, загружен другим загрузчиком классов, который вообще не знает об этом ресурсе. Вместо этого используйте контекст ClassLoader
, полученный из текущего Thread
. Он знает все.
InputStream is = Thread.currentThread().getContextClassLoader().getResourceAsStream(_filename + ".txt");
Ответ 2
Я использую IntelliJ и нашел для меня общий "gotcha", забыв определить соответствующий шаблон ресурса для включения файлов .txt,.css файлов и т.д. Это означает, что при запуске процесса сборки они будут исключать эти файлы из созданный файл jar, вызывающий вызовы getResource()
для возврата null.
Я подозреваю, что подобное может происходить с вашей средой Netbeans, поэтому стоит проверить.
Ответ 3
У меня такая же проблема, как у Дэвида Медоуза,
она работала с 2008 года и без проблем. Прочитайте все сообщения, касающиеся getResourceAsStream( )
здесь. Моя проблема в том, что я могу прочитать некоторые файлы из файла jar. Все png файлы можно прочитать, но файлы wav нет. Странно, если я переименую файл .wav
в .png
. Файлы можно загружать и воспроизводить!
Когда я развертываю приложение, он работает, может ли это быть IntelliJ каким-то образом?
Примечание. Я знаю, что файлы .wav могут быть доступны для использования с JarFile и JarEntry.
Решение в intelliJ. В настройках проекта добавьте папку с файлами ресурсов, в моем случае звуковые файлы, в качестве источника. Добавить
? *. wav (или ваш тип файла pref)
в настройках- > шаблонах ресурсов компилятора.
Ответ 4
Где начинается ваш путь класса? Началось ли это с misc
или ..
?
Можете ли вы разместить значение this.getClass().getName()
?
Если он возвращает misc.ClassName
, вы должны использовать this.getClass().getResourceAsStream("/resources/filename.txt")
.