Macierze: eksternalizacja i deeksternalizacja (Java)
Eksternalizacja i deeksternalizacja jest lepszym rozwiązaniem problemu zapisu macierzy niż serializacja i deserializacja.
Nasza klasa Matrix
musi implementować interface Externalizable
, co wiąże się z dodaniem 2 metod:
@Override public void readExternal(ObjectInput in) throws IOException, ClassNotFoundException { final int row = in.readInt(); final int col = in.readInt(); double[][] objs = new double[row][col]; for (int i = 0; i < row; i++) { for (int j = 0; j < col; j++) { objs[i][j] = (Double) in.readObject(); } } setArray(objs); } @Override public void writeExternal(ObjectOutput out) throws IOException { final int row = array.length; final int col = array[0].length; out.writeInt(row); out.writeInt(col); for (double[] doubles : array) { for (int j = 0; j < col; j++) { out.writeObject(doubles[j]); } } }
Teraz możemy macierz strumieniować do i z obiektów ObjectInputStream
i ObjectOutputStream
.
Macierz możemy zapisać do pliku i odczytać z pliku używając metod externalize
i deeksternalize
z klasyMatrixUtil
.
public static void externalize(Matrix matrix, String path) { try { FileOutputStream fos = new FileOutputStream(path); ObjectOutputStream oos = new ObjectOutputStream(fos); matrix.writeExternal(oos); oos.flush(); oos.close(); } catch (IOException e) { e.printStackTrace(); } }
public static Matrix deexternalize(String path) { Matrix mat = null; try { FileInputStream fis = new FileInputStream(path); ObjectInputStream ois = new ObjectInputStream(fis); try { mat.readExternal(ois); } catch (ClassNotFoundException e) { e.printStackTrace(); } ois.close(); } catch (IOException e) { e.printStackTrace(); } return mat; }
My jednak chcemy zapisywać macierze w bazie danych Apache Derby. Musimy dopisać sporo kodu. Uczynimy to w następnym wpisie.
Pliki do ściągnięcia
Moduł matrices – aktualny stan projektu = 029;