
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;
