Stream unvollständig

Status
Nicht offen für weitere Antworten.

okel

Neues Mitglied
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:

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.
 

André Uhres

Top Contributor
okel hat gesagt.:
ich versuche, Daten (XML) zu zippen und dann zu encrypten (DES). Leider wird der Stream nicht immer vollständig geschrieben.
Ich bin nicht sicher, aber das könnte eine Spur sein:
Ein Block-Cipher operiert auf Datenblöcken. Man muss sicherstellen,
daß die Datenlänge ein Blockvielfaches ist (padding schemes).
 

HoaX

Top Contributor
evtl encrypter.flush()/close() aufrufen? was auch immer für eine klasse hinter encrypter steckt
 

okel

Neues Mitglied
Die Abhängigkeit von der Datenlänge möchte ich mal nicht annehmen, denn (da hatte ich mich nicht klar ausgedrückt) die unterschiedliche Länge dessen, was in die Datei geschrieben wird, habe ich bei jeweils exakt gleiche Daten. Ich rufe mehrmals write(...) auf und erhalte jeweils ein anderes Ergebnis.

Den Encrypter habe ich an ein Beispiel aus dem Internet angelehnt, die encrypt()-Methode lautet
Code:
	public void encrypt(InputStream in, OutputStream out) {
		try {
			out = new CipherOutputStream(out, ecipher);

			int read = 0;
			while ((read = in.read(buf)) >= 0)
				out.write(buf, 0, read);
			
			out.close();
		} catch (java.io.IOException e) {
		}
	}

Ich bin inzwischen etwas schlauer, denn im abgekupferten Beispiel wird dummerweise eine java.io.IOException ignoriert. Und die fliegt natürlich prompt, wenn die Dateilänge zu klein ist.
Code:
java.io.IOException: Ungültiger Dateideskriptor
	at java.io.FileOutputStream.writeBytes(Native Method)
	at java.io.FileOutputStream.write(FileOutputStream.java:247)
	at javax.crypto.CipherOutputStream.write(DashoA13*..)
	at xasche.persist.DesEncrypter.encrypt(DesEncrypter.java:63)
	at xasche.persist.AbstractStorage$3.run(AbstractStorage.java:153)

Wenn jemand weiß, was mit meinem Dateideskriptor falsch sein könnte, ... Ich hab ein paar Hinweise auf java-Bugs in Dateioperationen gefunden, die aber alle eigentlich nur unter anderen Bedingungen auftreten.

Stefan
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
KonradN SonarLint: Resources should be closed bei Stream<T>? Allgemeine Java-Themen 6
S Umstellung von File auf Path - Probleme mit Stream Allgemeine Java-Themen 5
A verschachtelte for-Schleife in einen Stream umwandeln? Allgemeine Java-Themen 4
A Wie schreibe ich eine For-Schleife in ein Stream API um? Allgemeine Java-Themen 12
looparda Stream mit Sonderbehandlung des ersten Elements Allgemeine Java-Themen 17
R Java Stream: Ist es möglich, einen stream zusammenzufassen Allgemeine Java-Themen 6
S Mittelwert anhand eines Stream berechnen Allgemeine Java-Themen 5
H Stream in ArrayList umwandeln Allgemeine Java-Themen 2
M stream.Collectors Fehlermeldung Allgemeine Java-Themen 1
C TCP Server und BufferedReader Leerstring im Stream? Allgemeine Java-Themen 5
G Neues Objekt aus List<JsonObject> mit Stream Allgemeine Java-Themen 4
Y Liste in Stream Packen Allgemeine Java-Themen 1
N Java stream filtern. Allgemeine Java-Themen 19
H Collector Generics Problem (incl. Stream & Lambda) Allgemeine Java-Themen 4
N javax.xml.stream.XMLStreamException: ParseError at [row,col]:[1,1] Allgemeine Java-Themen 3
N [stream-api] Parameter pro Typ zählen Allgemeine Java-Themen 1
J Stream-basierter Cache Allgemeine Java-Themen 4
D IP-Cam live stream speichern Allgemeine Java-Themen 9
B BufferedWriter in InputStream oder Zeichen-Stream in Byte-Stream Allgemeine Java-Themen 5
D Klassen Zeit aus NMEA-Stream in SimpleDateFormat Allgemeine Java-Themen 17
J Stream-Murks! Allgemeine Java-Themen 18
T Problem mit gzip Stream und Ende der Datei Allgemeine Java-Themen 2
JAVATUX Java Programm mit ATI Stream Unterstützung Allgemeine Java-Themen 3
X Audio Internet-Stream Allgemeine Java-Themen 2
B Stream Verständnisproblem Allgemeine Java-Themen 2
P Mime Type aus Stream lesen Allgemeine Java-Themen 5
C Bit Stream Klasse Allgemeine Java-Themen 9
dayaftereh Serializable und Object In/Out Stream Allgemeine Java-Themen 2
M PCL Stream lesen und schreiben Allgemeine Java-Themen 6
musiKk Stream zum Lesen von Dateien mit seek und peek Allgemeine Java-Themen 2
J Problem mit Scanner-Stream Allgemeine Java-Themen 2
0 Stream/Datei an VLC übergeben und abspielen Allgemeine Java-Themen 10
B getImage() vom Stream oder File Allgemeine Java-Themen 3
N Werte Von C++ nach Java über den Stream möglich? Allgemeine Java-Themen 8
S Stream ReadLine() Allgemeine Frage Allgemeine Java-Themen 5
S Stream ohne Referenz kopieren ? Allgemeine Java-Themen 4
D FileInputStream bzw. BufferedInput Stream Puffern Allgemeine Java-Themen 6
G Live-Stream einer WebCam importieren Allgemeine Java-Themen 3
T Mehrere Dateien byteweise durch stream schieben Allgemeine Java-Themen 9
T Stream encodierrn und decodieren mit JSpeex Allgemeine Java-Themen 2
R Stream Byte für Byte durchgehen Allgemeine Java-Themen 5
O Input stream geht net Allgemeine Java-Themen 2
N Speichern von binären Dateien (Zip-Archiv) per Stream? Allgemeine Java-Themen 6
T Bit-Stream Allgemeine Java-Themen 12
R Stream für alle Dateiarten Allgemeine Java-Themen 9
thE_29 API für transport stream Allgemeine Java-Themen 2
M Output Stream / Protokoll does not support output Allgemeine Java-Themen 2
D GetResourceAsStream - Stream closed exception Allgemeine Java-Themen 5
G Umwandlung in Stream Allgemeine Java-Themen 5
J Output Stream Allgemeine Java-Themen 4
T SplashScreen wird nur unvollständig angezeigt Allgemeine Java-Themen 3
P JApplet unvollständig Dargestellt Allgemeine Java-Themen 8

Ähnliche Java Themen

Neue Themen


Oben