Zielony Smok - logo witryny

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

matrices033.zip

Moduł matrices – aktualny stan projektu = 033;