Ресурс Java как файл - PullRequest
       24

Ресурс Java как файл

118 голосов
/ 24 марта 2009

Есть ли в Java способ создания экземпляра файла на ресурсе, извлеченном из jar-файла через загрузчик классов?

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

Редактировать: По-видимому, идеальным подходом было бы держаться подальше от java.io.File в целом. Есть ли способ загрузить каталог из classpath и перечислить его содержимое (файлы / сущности, содержащиеся в нем)?

Ответы [ 6 ]

97 голосов
/ 07 июля 2009

У меня была такая же проблема, и я смог использовать следующее:

// Load the directory as a resource
URL dir_url = ClassLoader.getSystemResource(dir_path);
// Turn the resource into a File object
File dir = new File(dir_url.toURI());
// List the directory
String files = dir.list()
57 голосов
/ 24 марта 2009

ClassLoader.getResourceAsStream и Class.getResourceAsStream - определенно способ загрузки данных ресурса. Однако я не верю, что существует какой-либо способ «перечисления» содержимого элемента classpath.

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

Если вы знаете, что на самом деле у вас есть файл jar, вы можете загрузить его с помощью ZipInputStream, чтобы узнать, что доступно. Это будет означать, что у вас будет другой код для каталогов и файлов JAR.

Одна альтернатива, если файлы создаются в первую очередь отдельно, - включить файл манифеста своего рода, содержащий список доступных ресурсов. Объедините его в файл jar или включите в файловую систему как файл и загрузите его, прежде чем предлагать пользователю выбор ресурсов.

54 голосов
/ 13 апреля 2011

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

URL defaultImage = ClassA.class.getResource("/packageA/subPackage/image-name.png");
File imageFile = new File(defaultImage.toURI());

Надеюсь, это поможет.

10 голосов
/ 17 февраля 2016

Надежный способ создания экземпляра файла на ресурсе, извлеченном из jar-файла, - это копирование ресурса в виде потока во временный файл (временный файл будет удален при выходе из JVM):

public static File getResourceAsFile(String resourcePath) {
    try {
        InputStream in = ClassLoader.getSystemClassLoader().getResourceAsStream(resourcePath);
        if (in == null) {
            return null;
        }

        File tempFile = File.createTempFile(String.valueOf(in.hashCode()), ".tmp");
        tempFile.deleteOnExit();

        try (FileOutputStream out = new FileOutputStream(tempFile)) {
            //copy stream
            byte[] buffer = new byte[1024];
            int bytesRead;
            while ((bytesRead = in.read(buffer)) != -1) {
                out.write(buffer, 0, bytesRead);
            }
        }
        return tempFile;
    } catch (IOException e) {
        e.printStackTrace();
        return null;
    }
}
4 голосов
/ 24 марта 2009

Попробуйте это:

ClassLoader.getResourceAsStream ("some/pkg/resource.properties");

Доступно больше методов, например, посмотреть здесь: http://www.javaworld.com/javaworld/javaqa/2003-08/01-qa-0808-property.html

2 голосов
/ 03 мая 2010

Это один из вариантов: http://www.uofr.net/~greg/java/get-resource-listing.html

...