Binärdateien mit Input/Outputstream lesen und schreiben

Status
Nicht offen für weitere Antworten.

jollyroger

Bekanntes Mitglied
hallo,

nachdem mir in einem anderen Thread mitgeteilt wurde, das man mit FileReader bzw. FileWriter keine Binärdateien lesen und schreiben kann, versuche ich es nun mit input- bzw. outputStream.

Leider scheitert auch das....

Was ich mache:

- Einlesen der Datei, in meinem Test ein pdf, und konvertieren des Inhalts mit Base64:

Code:
	public void setAndEncodeSourceFileContent(String sourceFileName) {
	
		Base64 base64 = new Base64();
		FileInputStream fileInputStream = null;
		StringBuffer inputStreamAsBytes = new StringBuffer();
		
		try {
			fileInputStream = new FileInputStream(sourceFileName);
			int singleChar;
			
			while((singleChar = fileInputStream.read()) != -1){
				inputStreamAsBytes.append(singleChar);
			}
		} 
		catch (FileNotFoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		finally {
			if(fileInputStream != null){
				try {
					fileInputStream.close();
				} catch (IOException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
			}
		}
		
		this.sourceFileContent =  new String(
										base64.encode(
												inputStreamAsBytes
															.toString()
																.getBytes()));
		
}

- Dekodieren des Dateiinhalts mit Base64 und schreiben des Files, dabei kommt ein pdf raus:


Code:
	public void decodeSourceFileContentAndWrite2File(String path) {
		
		Base64 base64 = new Base64();
		
		FileOutputStream fileOutputStream = null;
		
		try {
			fileOutputStream = new FileOutputStream(path + "\\" + this.sourceFileName);
			fileOutputStream.write(base64.decode(sourceFileContent.getBytes()));

		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		finally {
			if(fileOutputStream != null){
				try {
					fileOutputStream.close();
				} catch (IOException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
			}
		}
	}

Versuch ich nun das pdf mit dem acrobat-reader zu öffnen, krieg ich die Meldung:

Code:
Acrobat Reader konnte bla.pdf nicht öffnen, da der Dateityp nicht unterstützt wird oder die Datei beschädigt ist (z.b. wenn sie als email-Anhang geschickt und nicht richtig dekodiert wurde

Was mach ich hier falsch?
 

Leroy42

Top Contributor
jollyroger hat gesagt.:
Was mach ich hier falsch?

Das kann alle möglichen Ursachen haben:

- fehlerhafte Base64-Enkodierung
- fehlerhafte Base64-Dekodierung
- Fehler beim Einlesen
- Fehler bei der Ausgabe (Vergessen Ausgabestream zu schließen, ...)

Ich würde dir empfehlen den Fehler modular einzukreisen:

1. Konstanten Byte-Array enkodieren, dann dekodieren und mit Original vergleichen.
2. Datei einlesen und schreiben OHNE enkodieren und vergleichen.
3. ...?

So mußt du prinzipiell vorgegen, wenn deine Transformationen komplex werden.
 

jollyroger

Bekanntes Mitglied
Hallo,

habs folgendermassen umgeschrieben und nun klappts:


Code:
	public void setAndEncodeSourceFileContent(String sourceFileName) {
	
		Base64 base64 = new Base64();
		FileInputStream fileInputStream = null;
		
		ByteArrayOutputStream byteArrayOutputStream  = new ByteArrayOutputStream();
		byte[] buffer = new byte[1024];
		
		try {
			fileInputStream = new FileInputStream(sourceFileName);
			
			for(int i = fileInputStream.read(buffer); i > 0; i = fileInputStream.read(buffer)){
				byteArrayOutputStream.write(buffer, 0, i);
			}
		} 
		catch (FileNotFoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		finally {
			if(fileInputStream != null){
				try {
					fileInputStream.close();
				} catch (IOException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
			}
		}
		
		this.sourceFileContent =  new String(
										base64.encode(
													byteArrayOutputStream
																.toByteArray()));
		
}

und

Code:
	public void decodeSourceFileContentAndWrite2File(String path) {
		
		Base64 base64 = new Base64();
		
		FileOutputStream fileOutputStream = null;
		
		try {
			fileOutputStream = new FileOutputStream(path + "\\" + this.sourceFileName);
			fileOutputStream.write(base64.decode(sourceFileContent.getBytes()));

		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		finally {
			if(fileOutputStream != null){
				try {
					fileOutputStream.close();
				} catch (IOException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
			}
		}
	}

Danke für die hilfe....
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
harrytut Java Input/Output Tests Junit Allgemeine Java-Themen 3
P Selenium . findElement . input Allgemeine Java-Themen 4
E Input/Output Mikro Input bekommen Allgemeine Java-Themen 4
G Input Frame Allgemeine Java-Themen 6
B In Java Methode mit generic input und output basteln? Allgemeine Java-Themen 4
MoxxiManagarm Credential Input Allgemeine Java-Themen 5
Kirby.exe Keyboard Input ohne Enter Allgemeine Java-Themen 43
T JSoup findet input Feld nicht?! Wie kann ich das Feld finden? Allgemeine Java-Themen 3
H Strategy Pattern - changeColor() Methode - input rgd oder hex einlesen Allgemeine Java-Themen 1
I Text aus Input-Box entnehmen und zuweisen Allgemeine Java-Themen 1
J Java Sound Api Sound input und Output auswählen Allgemeine Java-Themen 4
T ImageIO.read -> Can`t read input file Allgemeine Java-Themen 11
T Input und Outputstream , serielle Schnittstelle Allgemeine Java-Themen 1
DanielsLPecke Input/Output Arduino input. Allgemeine Java-Themen 4
H Security Manager (IIOException: Can't read input file!) Allgemeine Java-Themen 2
B Input/Output Konsolen input args Allgemeine Java-Themen 6
M Mikrofon Input simulieren Allgemeine Java-Themen 1
T Threads Input/Output im Thread - Datei ohne Inhalt Allgemeine Java-Themen 1
F FileOutput/Input Objekte Allgemeine Java-Themen 6
C System.in erhält Input von Tastatur. wo wird das festgelegt? Allgemeine Java-Themen 4
N Kalender Normen input/output Allgemeine Java-Themen 2
I Input in cmd Allgemeine Java-Themen 2
K Input file nicht lesbar Allgemeine Java-Themen 9
C Kompletter Pfad aus "input type=file" auslesen Allgemeine Java-Themen 3
B User-Input aus Zahlen und Operatoren - beste Umsetzung? Allgemeine Java-Themen 8
P Ascii Bild aus einem input file nur kommt nix im outputfile an?????? Allgemeine Java-Themen 5
D JOptionPane nur 1 Input möglich? Allgemeine Java-Themen 6
I input-/outputstream Allgemeine Java-Themen 6
T Wie kontinuierlichen asci input parsen? Allgemeine Java-Themen 3
N input programm Allgemeine Java-Themen 3
G Taushen der Input variablen einer method Allgemeine Java-Themen 14
O Input stream geht net Allgemeine Java-Themen 2
M BufferedReader input - hängt sich auf Allgemeine Java-Themen 4
W Mal ein paar generelle Fragen zu InputStream und OutputStream Allgemeine Java-Themen 4
Meeresgott Input/Output OutputStream löscht Datei Allgemeine Java-Themen 7
F Jar OutputStream Allgemeine Java-Themen 4
T Outputstream write() gets blocked using RXTX to communicate with HC-05 BT Module Allgemeine Java-Themen 10
D Java Process OutputStream ist null Allgemeine Java-Themen 4
P Input/Output Process.getErrorStream = OutputStream Allgemeine Java-Themen 11
G Auf Kommandozeile über Processobjekt mit Outputstream Allgemeine Java-Themen 3
M rxtx OutputStream sendet falsche werte Allgemeine Java-Themen 3
L Abspeichern von OutputStream Allgemeine Java-Themen 6
E Outputstream an verschiedenen Positionen beschreiben Allgemeine Java-Themen 4
A Eigenen OutputStream schreiben und verwenden Allgemeine Java-Themen 9
D zip Dateien schreiben mit in/outputstream Allgemeine Java-Themen 10
S OutputStream via POST senden Allgemeine Java-Themen 4
T OutputStream to InputStream Allgemeine Java-Themen 8
W StringBuilder effektiv auf OutputStream schreiben Allgemeine Java-Themen 3
Landei CipherInput/OutputStream-Problem Allgemeine Java-Themen 2
S von OutputStream in InputStream schreiben ohne das es blockiert..? Allgemeine Java-Themen 2
G Double Wert über OutputStream verschicken Allgemeine Java-Themen 2
S outputstream über fileUrl Allgemeine Java-Themen 15
L Problem mit dem OutputStream eines Prozesses Allgemeine Java-Themen 9
G OutputStream to System.out Allgemeine Java-Themen 35
Junktyz In Writer und Outputstream wird teilweise nicht geschrieben Allgemeine Java-Themen 3
reibi FileOutputStream aus OutputStream erstellen Allgemeine Java-Themen 7
H Problem mit OutputStream Allgemeine Java-Themen 5
T OutputStream - Prozente ermitteln Allgemeine Java-Themen 3
T OutputStream - Event bei Byte-Fluss Allgemeine Java-Themen 5
A Inputstream in Outputstream umleiten Allgemeine Java-Themen 7
D Cipher(In)OutputStream Allgemeine Java-Themen 3
R Ladebalken für einen Outputstream. Allgemeine Java-Themen 10
m@nu Schreibschutz entfernen und OutputStream öffnen Allgemeine Java-Themen 6
T Problem mit Outputstream? Allgemeine Java-Themen 2

Ähnliche Java Themen

Neue Themen


Oben