Вступление.
Некоторое время назад я представлял “Как программно управлять файлом конфигурации с помощью 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 List profile;
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”