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


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

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

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

6 114

6 ответов:

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

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

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

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

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

// 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()

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

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

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

надежный способ построить экземпляр файла на ресурсе, полученном из 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;
    }
}

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

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

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