
Zapis macierzy z użyciem XMLEncoder i XMLDecoder
Obiekty zbudowane z zachowaniem wymagań JavaBeans mogą być zapisane w pliku XML, a następnie odtworzone z tego pliku. W pliku XML zapisywane tylko te właściwości obiektu, których wartości są zmienione (różne od domyślnych).
Aby zapisać i odczytać możemy użyć metod writeXMLEncoder i writeXMLDecoder z klasy MatrixUtil.
public static void writeXMLEncoder(Matrix matrix, String path) {
FileOutputStream fos = null;
try {
fos = new FileOutputStream(path);
} catch (FileNotFoundException e) {
e.printStackTrace();
}
XMLEncoder out = new XMLEncoder(fos);
out.writeObject(matrix);
out.flush();
out.close();
}
public static Matrix readXMLDecoder(String path) {
FileInputStream fis = null;
try {
fis = new FileInputStream(path);
} catch (FileNotFoundException e) {
e.printStackTrace();
}
XMLDecoder dec = new XMLDecoder(fis);
Matrix matrix = (Matrix) dec.readObject();
dec.close();
return matrix;
}
W konstruktorze dodajemy adnotację:
@ConstructorProperties({"array"})
Jest to sygnał dla encodera aby uruchomić metodę setArray() i dane zwrócone przez tę metodę zapisać w obiekcie zapisanym w pliku.
XMLEncoder
Przykład w klasie Matrix046.
Klasa Matrix046
double[][] arr = {{6, 2, 3}, {4, 7, 5}, {1, 9, 8}};
Matrix matrix = new Matrix(arr);
MatrixUtil.writeXMLEncoder(matrix,
"matrices/assets/matrix4.xml");
Po uruchomieniu klasy w folderze matrices/assets pojawi się plik matrix4.xml. Po otwarciu pliku zobaczysz:
<?xml version="1.0" encoding="UTF-8"?>
<java version="13.0.1" class="java.beans.XMLDecoder">
<object class="matrices.Matrix" id="Matrix0">
<array class="[D" length="3">
<void index="0">
<array class="double" length="3">
<void index="0">
<double>6.0</double>
</void>
<void index="1">
<double>2.0</double>
</void>
<void index="2">
<double>3.0</double>
</void>
</array>
</void>
<void index="1">
<array class="double" length="3">
<void index="0">
<double>4.0</double>
</void>
<void index="1">
<double>7.0</double>
</void>
<void index="2">
<double>5.0</double>
</void>
</array>
</void>
<void index="2">
<array class="double" length="3">
<void index="0">
<double>1.0</double>
</void>
<void index="1">
<double>9.0</double>
</void>
<void index="2">
<double>8.0</double>
</void>
</array>
</void>
</array>
<void id="doubleArrayArray0" property="array"/>
<void property="array">
<object idref="doubleArrayArray0"/>
</void>
</object>
</java>
XMLDecoderr
Klasa Matrix047
Matrix matrix = MatrixUtil.readXMLDecoder(
"matrices/assets/matrix4.xml");
matrix.printToConsole();
Po uruchomieniu klasy na konsoli pojawi się:
6.0 2.0 3.0 4.0 7.0 5.0 1.0 9.0 8.0
Pliki do ściągnięcia
Moduł matrices – aktualny stan projektu = 033;
