# Binärdatei einlesen (byteweise)



## soeni1987 (14. März 2010)

Hallo ich möchte eine Binärdatei byteweise einlesen und in einem Array abspeichern.

Hab dazu was im Netz gefunden, wo jedoch immer die Fehlermeldung invalid stream header kommt.

hier der code:


```
FileInputStream fileInputStream = new FileInputStream(dateiname);
		System.out.println("test0");
		ObjectInputStream objectInputStream = new ObjectInputStream(fileInputStream);
		
		System.out.println("test1");
		
		String data[] = (String[]) objectInputStream.readObject();
		
		System.out.println("test2");
		
		objectInputStream.close();
		
		System.out.println("Daten: ");
		System.out.println(data);
```

wichtig, das ist keine Textdatei.

Das Konvertieren wäre ja kein problem wenn der fehler nicht käme bei 

ObjectInputStream objectInputStream = new ObjectInputStream(fileInputStream);

Was kann ich da machen?

Danke und Gruß

Sönke


----------



## Kai008 (14. März 2010)

Lies mit File.lenght die Größe aus, erstell das Array mit der Länge (Vorsicht, Dateigröße kann leicht die 2 Milliarden von int überschreiten, falls die Datei größer als ca. 1.9 GB ist, wobei du da idR. eh Probleme bekommen solltest.) und ließ mit FileInputStream.read(array, 0, array.lenght) oder read(array).

OIS sind afaik eine recht heikle Sache, die oft nicht wollen wie der Coder.


----------



## d4rkY89 (14. März 2010)

Nabend zusammen,

zunächst einmal möchte ich an dieser Stelle klarstellen, dass Daten eines Rechners egal welche Endung eine Datei hat, immer binär sind.
Die Dateiendungen dienen lediglich dazu diese binären Daten unterschiedlich interpretieren zu können. Demnach kann jede Datei genauso gut eine Textdatei sein und wie eine ausgelesen werden.
Mit diesem Code kannst du jede x-beliebige Datei byteweise einlesen und jedes einzelne Byte verarbeiten, wie du es gerne möchtest:


```
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;


public class Foo {

	/**
	 * @param args
	 * @throws IOException 
	 */
	public static void main(String[] args) throws IOException {
		File sourceFile = new File("testfile");
		
		FileInputStream in = new FileInputStream(sourceFile);
		
		System.out.print("Daten: ");
		
		for(int i; (i = in.read()) != -1; ) {
			System.out.print(String.valueOf(i));
			// System.out.print(i);		// Falls der Zahlenwert nicht der ASCII code erwünscht ist
		}
		
		//	Verwende diesen Code, wenn du die Datei gleich in ganzen Arrays einlesen willst.
		//	In diesem Fall 512 Bytes
		
		/*byte[] buffer = new byte[512];
		
		for(int i; (i = in.read(buffer)) != -1; ) {
			System.out.print(new String(buffer, 0, i));
		}*/

	}

}
```

Wie du die Daten in der for-Schleife interpretierst ist ganz Deine Sache.

Edit:

Achtung:  In der ersten Schleife werden in der Variablen "i" die Bytes, welche einzeln eingelesen werden, gespeichert während in der ausgeklammerten Schleife in der Variablen "i" die Anzahl der gelesenen Bytes gepeichert wird.  Angenommen, du hast ein 512 großes Bytearray und die Datei ist nur 400 Bytes groß, dann steht in dem fall in der Variablen "i" die 400. Die einzelnen Bytes werden in dem Bytearray "buffer" gespreichert und können dann bis zur Position "i-1" ausgelesen werden.

MFG d4rkY89


----------

