BufferedReader liest was anderes als BufferedWriter schreibt

Simmel

Mitglied
Moin moin,

stehe vor dem Problem, dass der BufferedReader scheinbar etwas anderes einliest als zu vor mit BufferedWriter geschrieben wurde, hier ein
Auszug aus den jeweiligen Methoden (lasst euch von dem Code nicht abschrecken):
Java:
// bis = BufferedReader
public byte[] readByteBlock(int blockSize)
	{
		// Prüfen ob wir am Ende der Datei sind
		byte[] inBytes;
		if ( fileReaderPosition >= fileLength)
		{
			// Dateiende
			return null;
		}
		// Dimensioniert das Array auf die gewünschte Blockgröße oder auf bis zum Dateiende
		else if ((fileReaderPosition + blockSize) > fileLength)
		{
			inBytes = new byte[(int)(fileLength - fileReaderPosition)];
		}
		else
		{
			inBytes = new byte[blockSize];
		}

		System.out.println("Liest ByteBlock (" + inBytes.length + "):");
		try
		{
			for (int i = 0; i < inBytes.length; i ++)
			{
				fileReaderPosition ++;
				inBytes[i] = (byte)bis.read();
				System.out.print(inBytes[i] + " ");
			}
			System.out.println();
		}
		catch (Exception e)
		{
			e.printStackTrace();
			return null;
		}
		return (inBytes);
	}

// bw= BufferedWriter
public void write(byte[] data) throws IOException
	{
		System.out.println("Schreibe Blöcke (" + data.length + "):");
		for (int i = 0; i < data.length; i ++)
		{
			bw.write(data[i]);
			System.out.print(data[i] + " ");
		}
		System.out.println();
	}
Ausführung:
Java:
System.out.println("Verschlüsselungsrunde");
			cipher.init(Cipher.ENCRYPT_MODE, keyPair.getPublic());
			FileReader fr = new FileReader("D:\\test.txt");
			FileWriter fw = new FileWriter("D:\\ausgabe.txt");
			byte[] data = fr.readByteBlock(53);
			while (data != null)
			{
				// cipher.doFinal(data) gibt ein 64 großes Byte-Array zurück
				fw.write(cipher.doFinal(data));
				data = fr.readByteBlock(53);
			}
		
			fw.close();
			fr.close();
			
			
			System.out.println("Entschlüsselungsrunde");
			cipher.init(Cipher.DECRYPT_MODE, keyPair.getPrivate());
			fr = new FileReader("D:\\ausgabe.txt");
			fw = new FileWriter("D:\\ausgabe2.txt");
			//for (int i = 0; i < decryptBytes.length; i ++)
			data = fr.readByteBlock(64);
			while (data != null)
			{
				fw.write(cipher.doFinal(data));
				data = fr.readByteBlock(64);
			}
			fw.close();
			fr.close();
Joa und die Ausgabe in der Konsole sieht wie folgt aus:
Code:
Verschlüsselungsrunde
Liest ByteBlock (53):
72 97 108 108 111 44 32 100 105 101 115 32 105 115 116 32 101 105 110 32 84 101 115 116 33 33 72 97 108 108 111 44 32 100 105 101 115 32 105 115 116 32 101 105 110 32 84 101 115 116 33 33 72 
Schreibe Blöcke (64):
72 11 109 29 -58 -89 3 99 85 82 24 -117 94 -43 119 10 58 -25 123 46 84 112 29 -8 -99 -128 124 115 28 73 -119 56 105 -109 -110 -119 46 -78 -42 37 -45 -63 -85 -127 92 61 118 13 98 7 -19 -67 104 -85 101 51 -102 98 -35 -109 -46 -58 -34 -23 
[...] (weitere Runden) [...]
Entschlüsselungsrunde
Liest ByteBlock (64):
72 11 109 29 63 63 3 99 85 82 24 63 94 63 119 10 58 63 123 46 84 112 29 63 63 63 124 115 28 73 63 56 105 63 63 63 46 63 63 37 63 63 63 63 92 61 118 13 98 7 63 63 104 63 101 51 63 98 63 63 63 63 63 63
Hier sieht man schon das beim zweiten eingelesene Byte der ersten Einleserunde der "Entschlüsselungsrunde" nicht mit dem ersten geschriebenen Block der Verschlüsselungsrunde übereinstimmt. Die Dateien werden zwischenzeitlich nicht mehr verändert. Wie kommt es dann zu diesen Differenzen?

Ich hoffe ihr könnt mir helfen!!
Viele Grüße
 
Reader lesen unsigned. Versuchs mal zu signen.

Java:
int i = bis.read();
byte b = (byte)(i & 0xff);
Dürfte nichts bringen, sondern nur wenn man von byte -> int die Bits 1:1 übernehmen will.


Warum nutzt die Reader/Writer? Die sind für Text gedacht! Nutz Input/OutputStream, dann sollte es ohne Probleme funktionieren.

Edith sagt:
Schmutzige Lösung:
Java:
bw.write(data[i]);
durch
Java:
bw.write(data[i] & 0xff);
ersetzen. Aber statt Reader/Writer einfach Input/Outputstreams zu verwenden ist die wirklich saubere Lösung und in keiner Weise aufwendiger.
 
Zuletzt bearbeitet:
Super Danke, verwende jetzt lediglich die Input- und OutputStreams und es funktioniert. Hatte die BufferedReader/Writer verwendet, da ich der Meinung bin, mal gehört zu haben, dass die bei großen Dateien (> 1 GB) schneller und sicherer sind. Ist das was dran?
🙂
 
Nein, da ist absolut nichts dran. Die sind höchstens langsamer, da sich sich noch um das Encoding kümmern, und somit u.U. mehrere Bytes zu einem zusammenfassen -> Bei binären Daten niemals Reader/Writer nutzen!
 
Super Danke, verwende jetzt lediglich die Input- und OutputStreams und es funktioniert. Hatte die BufferedReader/Writer verwendet, da ich der Meinung bin, mal gehört zu haben, dass die bei großen Dateien (> 1 GB) schneller und sicherer sind. Ist das was dran?
🙂

Jein. Gepufferte Streams sind u. U. schon effektiver, aber bei Input- und OutputStream sollte man dann BufferedInput- und -OutputStream verwenden.
 

Zurück
Oben