Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Java: Общие вопросы > Загрузка ресурсов.


Автор: Terentich 16.1.2010, 14:00
Здравствуйте!

Очень нужно загрузить папку с ресурсами, однако, как я понимаю, метод getResource() позволяет лишь загружать конкретные файлы, а это мне не подходит. 

Подскажите, пожалуйста, возможные пути решения.

Автор: jk1 16.1.2010, 14:36
Изначально дописать нужную папку в classpath

Автор: Terentich 16.1.2010, 15:36
Так и есть. Папка прописана в classpath, а мне нужны файлы внутри неё. Проблема в том, что точных имён файлов я не знаю, мне надо просмотреть что в папке лежит. 

Автор: jk1 16.1.2010, 17:16
Если знаете название папки, смотрите так:
Код

 File targetFolder =new  File("c:/"); // это ваша папка
        for(File file:targetFolder.listFiles()){
            if (!file.isDirectory()) {
                ImageIcon icon = new ImageIcon(file.getAbsolutePath());
                System.out.println("Icon created: " + icon.toString());
            }
        }

Автор: LSD 16.1.2010, 17:45
Цитата(Terentich @  16.1.2010,  14:00 Найти цитируемый пост)
как я понимаю, метод getResource() позволяет лишь загружать конкретные файлы

Неправильно понимаешь. Загружать позволяет getResourceAsStream(), а getResource() возвращает URL этого ресурса. Проанализировав этот URL (как минимум выяснив протокол) можно попытаться получить все соседние ресурсы.

В твоем конкретном случае надо проверить, что протокол file, дальше new java.io.File(URI)getParent() и вперед.

Автор: Terentich 16.1.2010, 19:31
jk1, так не получится. Не могу указать абсолютный путь, потому что данный код выполняется библиотекой и все пути должны быть относительными, чтобы можно было использовать в других программах.
Если же укажу относительный путь, то метод listFiles() возвратит пустой массив, так как приложение будет выполнятся из другой папки - папки приложения. 

К примеру, я храню папку "icons" здесь: "C:/lib/icons".
Для доступа к ней в библиотеке использую относительный путь "icons", но возникнет проблема, так как если запущу приложение из папки "C:/app", то библиотека будет искать папку по пути: "C:/app/icons", что неверно.

LSD, спасибо, но getResourceAsStream() и getResource() вернули null. :(

Автор: dorogoyIV 16.1.2010, 20:11
ну тогда для начала нужно найти файлы, оттуда получить абсолютные пути, ну и т.д. ...

Автор: Terentich 16.1.2010, 20:23
Как же я могу найти файлы, если мне неизвестно содержимое папки "icons"?
В том-то вся и проблема, что я знаю лишь имя папки, а мне нужно её содержимое.

Автор: jk1 16.1.2010, 21:05
Terentich,  поставьте пожалуйста задачу конкретно. Например, так "Есть (сетевая, локальная) папка о которой известно ... . Нужно из её содержимого сделать....  ". Желательно с примером для большей ясности.

Об относительных путях: если относительный путь валиден, то за исключением некоторых случаев (зацикленных символических ссылок например) он может быть разрешен в абсолютный методом getAbsolutePath();

Автор: Terentich 16.1.2010, 21:38
Да, пожалуй, сумбурно описал.  smile 

Пишу библиотеку, которую будут использовать другие программы, подключая её как jar-файл в classpath. 
В jar-файле библиотеки я храню локальную папку "icons" (об этой папке известно лишь то, что она содержит графические файлы).

В самой библиотеке мне нужно получить ссылки на файлы из папки "icons". Как это сделать?

Надеюсь, что понятно описал.

Автор: Terentich 17.1.2010, 00:31
Все же http://java.sun.com/docs/books/tutorial/uiswing/components/icon.html#getresource надо читать в первую очередь, столько времени убил. :(

Но это так мне и не помогло с загрузкой папки с ресурсами.

Автор: dobrolub 17.1.2010, 06:29
Здорово, коли ни шутишь.
InputStream с ресурса-директории просто будет содержать имена директорий и файлов, вот построчно их и читай. smile
Код

tmp $mkdir -p x/y/z
tmp $echo a >x/y/z/a.inc
tmp $echo a >x/y/z/b.inc
tmp $jar -cf x.jar x
tmp $jar -t x.jar
^Ctmp $jar -tf x.jar
META-INF/
META-INF/MANIFEST.MF
x/
x/y/
x/y/z/
x/y/z/a.inc
x/y/z/b.inc


Код

import java.io.*;

public class T {
    public static void main(String []args) throws Exception {
        BufferedReader reader = new BufferedReader(new InputStreamReader(T.class.getClassLoader().getResourceAsStream("x/y/z")));
        String str;

        while ((str = reader.readLine()) != null)
               System.out.println("file: " + str);
    }
}


Код

tmp $java -cp .:x.jar T
file: a.inc
file: b.inc


Автор: Terentich 17.1.2010, 10:49
dobrolub, не выходит.

Метод

Код

T.class.getClassLoader().getResourceAsStream(pathname);


возвращает null.

Я работаю в Eclipse и эту папку подключаю как "Class folder" (Java Build Path -> Add Class folder), т. е. как папку, содержащую классы.
Может быть это неверно?

Автор: dobrolub 17.1.2010, 21:46
Возможно eclipse немного углубился в директории при добавлении и добавил вместо корня первую папку под корнем.

Например если у тебя пакет x/y/z находящийся в папке /tmp то надо убедится, что именно папка /tmp добавлена, а не папка /tmp/x

Посмотри на тест- проект в прикреплённом test.jar


Автор: LSD 18.1.2010, 18:07
Цитата(Terentich @  16.1.2010,  19:31 Найти цитируемый пост)
LSD, спасибо, но getResourceAsStream() и getResource() вернули null. :(

Потому, что он возвращает именно Resource, а не папку или еще какую подобную фигню.

В принципе самый нормальный способ это создать файл со списком иконок (имя его разумеется фиксировано). Читать этот файл и уже тогда грузить иконки. Все остальное извраты с ClassLoader очень ненадежны. Если например твое приложение будет использоваться в апплете и ClassLoader будет сетевой, но никакого listFiles() там может и не быть.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)