Подтвердить что ты не робот

Проблемы с использованием 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 для достижения той же цели, но теперь это своего рода принцип!

4b9b3361

Ответ 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").