Hallo,
ich versuche, Daten (XML) zu zippen und dann zu encrypten (DES). Leider wird der Stream nicht immer vollständig geschrieben. Hier ist der Code:
Zunächst mal bin ich mir nicht sicher, ob mein Konstrukt mit dem Thread sinnvoll ist, aber nur so ist mein Programm nicht einfach stehen geblieben, denn die encrypt-Methode und das XmlWriter.write müssen ja gleichzeitig laufen, oder?
Mein eigentliches Problem ist aber, dass die Dateilänge nach dem Schreiben gerne mal kleiner ist als gewünscht, was dann natürlich zu Datenverlust führt. Manchmal sind es nur ein paar Byte, manchmal aber bis zu ca. 100 Byte (Soll: ~257 kByte). Ich habe auch schon diverse flush-Aufrufe eingebaut, aber geholfen hat es nicht.
Ich verwende jdk1.6.0_07 unter Linux.
Grüße
Stefan
Edit: Eigentlich sollte der Titel "Encrypteter gezippter FileOutputStream unvollständig" heißen, aber das geht aus "Spamschutzgründen" nicht.
ich versuche, Daten (XML) zu zippen und dann zu encrypten (DES). Leider wird der Stream nicht immer vollständig geschrieben. Hier ist der Code:
Code:
public boolean write(PersistentData persistentData) throws StorageException {
try {
FileOutputStream fileOutputStream = new FileOutputStream(new File(fileName));
writeToStream(persistentData, fileOutputStream);
fileOutputStream.close();
return true;
} catch (FileNotFoundException ex) {
throw new StorageException(ex);
} catch (IOException ex) {
ex.printStackTrace();
}
return false;
}
protected void writeToStream(PersistentData persistentData, final OutputStream stream) throws IOException {
OutputStream outputStream = null;
final PipedInputStream pipedInputStream = new PipedInputStream();
outputStream = new PipedOutputStream(pipedInputStream);
new Thread() {
public void run() {
encrypter.encrypt(pipedInputStream, stream);
try {
pipedInputStream.close();
} catch (IOException ex) {
ex.printStackTrace();
}
}
}.start();
ZipOutputStream zipOutputStream = new ZipOutputStream(outputStream);
zipOutputStream.setLevel(zipLevel);
zipOutputStream.putNextEntry(new ZipEntry("meta"));
zipOutputStream.write(Long.toString(System.currentTimeMillis()).getBytes());
zipOutputStream.putNextEntry(new ZipEntry("data"));
Model model = persistentData.getModel();
XmlWriter.write(zipOutputStream, model.getData());
zipOutputStream.closeEntry();
zipOutputStream.close();
outputStream.close();
}
Zunächst mal bin ich mir nicht sicher, ob mein Konstrukt mit dem Thread sinnvoll ist, aber nur so ist mein Programm nicht einfach stehen geblieben, denn die encrypt-Methode und das XmlWriter.write müssen ja gleichzeitig laufen, oder?
Mein eigentliches Problem ist aber, dass die Dateilänge nach dem Schreiben gerne mal kleiner ist als gewünscht, was dann natürlich zu Datenverlust führt. Manchmal sind es nur ein paar Byte, manchmal aber bis zu ca. 100 Byte (Soll: ~257 kByte). Ich habe auch schon diverse flush-Aufrufe eingebaut, aber geholfen hat es nicht.
Ich verwende jdk1.6.0_07 unter Linux.
Grüße
Stefan
Edit: Eigentlich sollte der Titel "Encrypteter gezippter FileOutputStream unvollständig" heißen, aber das geht aus "Spamschutzgründen" nicht.