# Binärdateien mit Input/Outputstream lesen und schreiben



## jollyroger (26. Sep 2006)

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:


```
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:



```
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:


```
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 (26. Sep 2006)

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.


----------



## Roar (26. Sep 2006)

du benutzt doch noch immer Strings und char[]s :?:


----------



## jollyroger (27. Sep 2006)

Hallo, 

habs folgendermassen umgeschrieben und nun klappts:



```
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 


```
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....


----------

