Вступление.
Некоторое время назад я представлял “Как программно управлять файлом конфигурации с помощью YAML на Java” в предыдущем посте. если ты хочешь это знать, перейдите по ссылке: Как программно управлять файлом конфигурации с помощью YAML на Java
Речь шла о передаче содержимого файла Yaml для создания объекта Java Bean. Это включало информацию о конфигурации или сериализованном Ценном объекте (VO). Проще говоря, речь шла о загрузке или сбросе информации между файлом Yaml и объектом Java.
Между тем, кто-то, у кого есть острое мышление, спросил, как получить доступ к файлу Yaml во внутренних ресурсах? Поэтому я понял, что это необходимо, Здесь я хотел бы показать, как загрузить и выгрузить файл Yaml в Jar.
Настройка среды.
- Как и в предыдущем посте, для обработки файла Yaml нам нужна библиотека SnakeYaml.
- Для наших работ можно использовать любые инструменты IDE, но в наши дни я собираюсь использовать код Visual Studio (VSCODE) в fever.
- И мы должны установить зависимость SnakeYaml MAVEN на POM.xml . В предыдущем посте я использовал Gradle, но теперь использовал бы MAVEN для разнообразия:)
- Если вы готовы к вышеперечисленным вещам, будьте готовы начать кодирование.
Проектирование класса Java.
Прежде чем мы увидим реализованный код, я бы показал вам весь дизайн наших работ.
- Мы определим класс java с именем “Yaml InternalHandler” для обработки файла Yaml в Jar.
- Определит два метода с именами “загрузить внутреннюю банку” и “сбросить внутреннюю банку”. Первый – загрузить содержимое Yaml в объект Java с путем входа в jar и объектом класса, в который будет загружено содержимое. Второй – сбросить значения объекта в файл Yaml в Jar с путем входа в jar и экземпляром объекта Java, включающим значения.
- Мы могли бы загрузить и сбросить указанное сопоставление объектов с помощью файла Yaml в jar. Конечно, хорошо бы убедиться в синтаксисе файла Yaml в Jar.
Давайте погрузимся в код.
Содержимое файла Yaml в Jar находится ниже.
firstName: Kooin lastName: Shin age: 48 profile: - character: bright hobby: claiming address: Seoul postalCode: 123 - character: delight hobby: ski address: Seoul postalCode: 123
Содержимое загружаемого Java-компонента – это “Клиент” и “Профиль”, представляющие ценности Yami.
package org.chaostocosmos.doc.yml; import java.util.List; public class Customer { private String firstName; private String lastName; private int age; private Listprofile; public Customer() {} public String getFirstName() { return this.firstName; } public void setFirstName(String firstName) { this.firstName = firstName; } public String getLastName() { return this.lastName; } public void setLastName(String lastName) { this.lastName = lastName; } public int getAge() { return this.age; } public void setAge(int age) { this.age = age; } public List getProfile() { return this.profile; } public void setProfile(List profile) { this.profile = profile; } @Override public String toString() { return "{" + " firstName='" + firstName + "'" + ", lastName='" + lastName + "'" + ", age='" + age + "'" + ", profile='" + profile + "'" + "}"; } }
package org.chaostocosmos.doc.yml; public class Profile { String character; String hobby; String address; int postalCode; public Profile() {} public String getCharacter() { return this.character; } public void setCharacter(String character) { this.character = character; } public String getHobby() { return this.hobby; } public void setHobby(String hobby) { this.hobby = hobby; } public String getAddress() { return this.address; } public void setAddress(String address) { this.address = address; } public int getPostalCode() { return this.postalCode; } public void setPostalCode(int postalCode) { this.postalCode = postalCode; } @Override public String toString() { return "{" + " character='" + character + "'" + ", hobby='" + hobby + "'" + ", address='" + address + "'" + ", postalCode='" + postalCode + "'" + "}"; } }
А теперь мы покажем основной код класса YamlInternalHandler.
package org.chaostocosmos.doc.yml; import java.io.File; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.io.OutputStreamWriter; import java.util.jar.JarEntry; import java.util.jar.JarFile; import java.util.jar.JarOutputStream; import java.util.zip.ZipEntry; import org.yaml.snakeyaml.DumperOptions; import org.yaml.snakeyaml.Yaml; import org.yaml.snakeyaml.DumperOptions.FlowStyle; import org.yaml.snakeyaml.constructor.Constructor; /** * Yaml Internal Handler * * @author Kooin-Shin * @since 2021.01.04 */ public class YamlInternalHandler { /** * Jar file having yaml file */ File file; /** * Constructor * @param file * @throws IOException */ public YamlInternalHandler(File file) throws IOException { this.file = file; } /** * Load object from internal yaml file in jar * @param jarEntry * @param clazz * @return * @throws IOException */ public Object loadInternalJar(String jarEntry, Class extends Object> clazz) throws IOException { if (!jarEntry.endsWith(".yml")) { throw new IllegalArgumentException("This component only support a yaml file in jar!!!"); } JarFile jarFile = new JarFile(this.file); //Create JarFile object JarEntry entry = jarFile.getJarEntry(jarEntry); //Get JarEntry specified by first parameter InputStream is = jarFile.getInputStream(entry); //Get InputStream from JarFile by JarEntry Constructor constructor = new Constructor(clazz); //Create Constructor object specified by second parameter Yaml yaml = new Yaml(constructor); //Create Yaml object with Constructor object Object obj = yaml.load(is); //Load contents to object instance is.close(); //Close InputStream jarFile.close(); //Close JarFile return obj; } /** * Dump object to yaml file in jar * @param jarEntry * @param obj * @throws FileNotFoundException * @throws IOException */ public void dumpInternalJar(String jarEntry, Object obj) throws FileNotFoundException, IOException { JarOutputStream jos = new JarOutputStream(new FileOutputStream(this.file)); //Create JarOutputStream object jos.putNextEntry(new ZipEntry(jarEntry)); //Put jar entry by first parameter DumperOptions options = new DumperOptions(); //Set dump options options.setDefaultFlowStyle(FlowStyle.BLOCK); options.setPrettyFlow(true); Yaml yaml = new Yaml(options); //Create Yaml object with DumperOptions object yaml.dump(obj, new OutputStreamWriter(jos)); //Dump contents of second parameter jos.close(); // Close JarOutputStream } public static void main(String[] args) throws IOException { File file = new File("D:\\Projects\\chaos-commons\\yaml.jar"); YamlInternalHandler ymlHandler = new YamlInternalHandler(file); Customer customer = (Customer) ymlHandler.loadInternalJar("tmp/yaml/Customer.yml", Customer.class); System.out.println(customer.toString()); customer.setFirstName("Jim "); customer.getProfile().get(0).setAddress("Busan"); ymlHandler.dumpInternalJar("tmp/yaml/Customer.yml", customer); } }
Вывод
Приведенный выше код предполагает очень простые случаи доступа к Yaml в Jar. Как ситуация, Она может быть преобразована, изменена и улучшена. Всегда эластичное мышление – ваше!!! удачи!!!
Оригинал: “https://dev.to/kooin/how-to-handling-internal-yaml-in-jar-261n”