Java: не могу понять, как использовать class.getClassLoader (). GetResourceAsStream (), поэтому он работает, когда я создаю артефакты - PullRequest
0 голосов
/ 28 декабря 2018

Мне было поручено разработать бот-диск для моего друга, и мне нужно загрузить несколько строк из файла.Теперь, чтобы сделать эту работу, когда я экспортирую проект в jar, кто-то сказал мне использовать class.getClassLoader (). GetResourceAsStream ()

После того, как я возился в течение 2 часов, читал документацию и снова спрашивал, я получилэто работать в IntelliJ.Это все еще не работает, когда я собираю проект.

Структура проекта Мой код:

static final ArrayList<String> QUOTES = new ArrayList<>();

public static void loadArray() {
    try{
        //File fin = new File("src/main/java/com/github/MarvelousAdain/Quotes");
        //FileInputStream fis = new FileInputStream(fin);
        System.out.println("Called loadArray Method");
        BufferedReader br = new BufferedReader(new InputStreamReader(Utilities.class.getClassLoader().getResourceAsStream("Quotes")));

        String line;
        while ((line = br.readLine()) != null) {
            QUOTES.add(line);
        }
        System.out.println("Quotes loaded, no Problem.");
        br.close();
    }catch(IOException e){e.printStackTrace();}
}

Если я пытаюсь запустить свой код в банке, это выдаетисключение NullPointerException.

Stacktrace:

Exception in thread "main" java.lang.NullPointerException
    at java.io.Reader.<init>(Unknown Source)
    at java.io.InputStreamReader.<init>(Unknown Source)
    at com.github.MarvelousAdain.Utilities.loadArray(Utilities.java:31)
    at com.github.MarvelousAdain.Main.main(Main.java:18)

Помощь будет принята с благодарностью.

Ответы [ 2 ]

0 голосов
/ 28 декабря 2018

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

Я собрал банку, открыл ее с помощью winrar и положил 3 файла, которые хочу прочитать.там.Это сработало.Если я поместил их в то же место в IDE, это не так.Я понятия не имею, как / почему это так, но сейчас это работает для меня.Я обновлю это, если найду что-нибудь получше!

0 голосов
/ 28 декабря 2018

Является ли инструмент, который создает банку, включая ресурс?

Вы можете проверить с помощью

jar tf myjar.jar

Или действительно, ваш любимый zip-инструмент.

Особо getResourceAsStream() возвращает null вместо выдачи какого-либо IOException, как это сделал бы обычный API.

Также обратите внимание, что ClassLoader.getResourceAsStream примет имя относительно пути к классам, но Class.getResourceAsStream изменит путь, используяимя пакета указанного класса (то есть в том же «каталоге», что и файл .class).

...