Прочитайте текстовый файл, который не находится в основном пакете в работающем фляге

2

У меня есть программа Swing Java, которая читает *.txt файлы в папке ресурсов с именем res, содержащей вложенные папки разного типа JSON. Когда я запускаю прямо из Eclipse, все в порядке. Если я создаю исполняемую банку, это не сработает. Мне удалось заставить его работать с ужасающим решением, помещая все мои текстовые файлы в пакет, где они вызываются.

Чтобы прочитать их, я использую эту строку кода:

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

где file - строка. Я думал, что это будет искать в банке указанный файл, но, очевидно, нет. Я попытался поместить путь к файлам, res/subfolder/name_of_file.txt и вложенной папке /name _of_file.txt, но безрезультатно. Вот структура моего проекта

Project
   src
      com.package
   res
      JSON_type1
      JSON_type2
         file.txt

Из com.package у меня есть класс, который должен читать из JSON_type2/file.txt. Помимо очевидной причины сохранения моего текстового файла во вложенных папках, мой графический интерфейс заполняет выпадающий список содержимым этих подпапок.

Из того, что я собрал из других вопросов здесь, getResourceAsStream() было бы моим решением, если бы я хотел сохранить текстовые файлы в пакете, где они вызываются. Помимо этого я нашел что-то о подклассе ClassLoader и перезаписав findResource(). Если возможно, я хочу избежать этого решения, поскольку я далеко не знаком с этим классом и его функциональными возможностями.

Если вам нужна дополнительная информация, дайте мне знать.

Спасибо

P.S.: Этот вопрос возник из моего предыдущего вопроса здесь

Теги:
jar
runnable
swing

3 ответа

4
Лучший ответ
// added leading / to indicate search from root of class-path
String file = "/res/JSON_type2/file.txt";
InputStream is = this.getClass().getResourceAsStream(file);
  • 0
    Может быть, моя проблема лежит где-то еще тогда. Использование этого пути приводит к ошибке, но если я помещаю текстовые файлы в src / com.package и использую this.getClass().getResourceAsStream("file.txt"); оно работает. Любая идея, где я мог бы искать другую ошибку?
  • 0
    Да, это все еще работает. Но я хочу, чтобы мой текстовый файл находился в папке res / JSON_type2, а не в пакете com.package
Показать ещё 3 комментария
4

Вы можете обращаться к файлам в пакетах, деля их на косые черты, например, для file.txt вы должны getResourceAsStream("/res/JSON_type2/file.txt")

Слэши не относятся к структуре папок, а не зависят от платформы, они просто способ, которым загрузчик классов обращается к файлам.

  • 0
    Можете ли вы уточнить, что вы подразумеваете под "не для структуры папок"? Мои текстовые файлы находятся в папках с путем res / JSON_type2 / file.txt . Я добавил свою папку res в путь сборки (и подпапки JSON_typeX получили украшение, которого я никогда раньше не видел, вроде белого пакета с чем-то вроде открытой папки). Так что я не знаю, добавляет ли моя папка res в путь сборки пакет, но насколько я понимаю, это просто папка с подпапками, в которой нет кода. В любом случае, добавление пути, подобного этому, приводит к созданию специального исключения, в котором говорится, что InputStream имеет значение null.
  • 0
    Конечно, структура пакетов jar-файлов (или, если быть более общим, путей классов java) действительно размещена в папках, но символ, который вы используете для обращения к ним, "/" может быть немного запутанным, особенно если вы привыкли к unix окружений, но если вы переключаетесь на среды Windows, вы не должны менять / для \, потому что это только символ, который загрузчик классов использует для разделения пакетов на пути к классам, а не настоящий разделитель папок.
1

В Eclipse я смог получить в основном функциональность, которую вы ищете:

src (folder)
   main (package)
      ...Classes...
other (folder)
   res  (package)
      ...txt files...

Кажется, что Eclipse полностью игнорирует папки и заботится только о пакетах. Пока я помещаю свои текстовые файлы в пакет a, я могу захватить InputStream с помощью getResourceAsStream ( "/res/somefile.txt" ).

Ещё вопросы

Сообщество Overcoder
Наверх
Меню