Копирование файла из ресурсов jar

245
18 января 2018, 20:23

Можно ли скопировать файл src/main/resources/hibernate.cfg.xml?
Что ни будь типа

Files.copy(файл_из_ресурсов.toPath(), new File("D:\\hibernate.cfg.xml").toPath());

Собственно, после сборки jar-ника ничего не получается.

Answer 1

Нельзя. Но можно скопировать содержимое:

public void copyResource() {
    try (InputStream in = getClass()
                            .getClassLoader()
                            .getResourceAsStream("hibernate.cfg.xml");
         OutputStream out = new FileOutputStream("D:\\hibernate.cfg.xml")) {
        int data;
        while ((data = in.read()) != -1) {
            out.write(data);
        }
    }
    catch (IOException exc) {
        exc.printStackTrace();
    }
}
Answer 2

Вообще говоря, где именно в jar-файле содержится ваш ресурс -- это зависит от того, чем и как вы упаковывали ваш jar-файл. Eclipse, например, по умолчанию располагает папку resources в корне директории src и при сборке копирует ее в bin, а при экспорте в jar копируется содержимое папки bin, таким образом, содержимое папки resources доступно там же, откуда загружаются классы, по относительному пути resources/XXX.XXX, где XXX.XXX -- имя файла. В этом случае доступ к файлу можно получить так:

getClassLoader().getResourceAsStream("resources/file.txt");

Вот сниппет, с которым можете поиграться:

    import java.io.FileNotFoundException;
    import java.io.IOException;
    import java.io.InputStream;
    import static java.nio.file.StandardCopyOption.*;
    import java.nio.file.Files;
    import java.nio.file.Path;
    import java.nio.file.Paths;
    public class Ru_So_772259 {
        // Ru_So_772259_Копирование_файла_из_ресурсов_jar
        public static void main(String[] args) {
          try {
            String fileName = "resources/MyFile.txt"; // Должен быть src/resources/MyFile.txt
            InputStream inpStream = Ru_So_772259.class.getClassLoader().getResourceAsStream(fileName);
            if (inpStream == null) throw new FileNotFoundException(fileName + " not found");
            Path target = Paths.get("MyCopy.txt");
            Files.copy(inpStream, target, REPLACE_EXISTING);
            Files.copy(target, System.out);         // Просто дублировать на экран, чтоб видно было 
            inpStream.close(); 
            System.out.println("На этот раз повезло!");
          } catch (IOException e) {
            System.out.println("Облом: ");
            e.printStackTrace(System.out);
          }
        }
    }
READ ALSO
How to add physics to Java3d [требует правки]

How to add physics to Java3d [требует правки]

I'm develop a basic Java3d applicationHow to add physics to Java3d application and does it even exit for Java3d ? Please help me or give me advice

281
Кодировка БД MySql

Кодировка БД MySql

Есть сервер яваИспользую mysql

222
Разница между singleton в Java и в Spring

Разница между singleton в Java и в Spring

Наткнулась на такие строки про область видимости Singleton в Spring:

298
Как “выделить” селектор для работы в нем

Как “выделить” селектор для работы в нем

Например на странице есть селектор div#player1, в нем находятся другие селекторы, которые нужно заменять пусть будет div#player1 #sum, div#player1 #sum2

189