# Von Datei byte für byte lesen und in ein Array einfügen.



## tobiasbeil (2. Dez 2005)

Hallo alle!

(Mein erster Beitrag btw...)   

Ich würde gerne wissen, wie man eine Datei einliesst, aber so,
dass eine Art Iterator (oder Enumerator) drüber fliegt, damit ich
jedes Byte der Datei in einer bestimmten Reihenfolge in ein Array
bringen kann. Alle sonstigen Methoden stehen soweit und sind getesten.
Ich habe auch einen Test eingebaut, der vorher überprüft ob die
Anzahl der Bytes mit der Anzahl aller Elemente in meinem
dreidimensionellen Array übereinstimmt. Dazu müsste ich zusätzlich
wissen, wie ich die Grösse der einzulesenden Datei in Bytes ausgeben
kann (eineDatei.getSize() ???). Das Schreiben ins 3d Array geschiet
über eine monstermörder komplizierte for-Schleife mit momentan
drei Iteratoren i,j,r. Am allerliebsten wäre es mir da, wenn ich irgendwie
einen vierten Iterator d hätte, der das d-te. Byte der Datei representiert,
bzw. die Stelle an der das d-te Byte ist.

<Datei>
Dies ist ein Text. Es könnte aber auch eine Binärdatei sein.
</Datei>

d[0] = "D". // Erstes Byte der Datei...
d[4] = " ".
d[6] = "s".

usw.
(nur so als Beispiel, konkret interpretiere ich jedes Byte als Interger von 0 - 255)

BTW: ich könnte meine monstermörder for-Schleife auch so umstellen,
dass sie ganz schön und übersichtlich wäre, aber dazu müsste ich dann
in der Datei die Bytes in einer bestimmten Reihenfolge lesen, was schlecht
für die performance ist (HDD ist limitierender Faktor), daher sollte ich es
so hinbekommen, dass stattdessen die for-Schleife ne perverse bijektive
Funktion darstellt, die Datei dafür aber babyleicht einfach Byte für Byte
in numerischer Reihenfolge ausgelesen wird bis zum EOF.

Ich wäre äusserst dankbar für jede Hilfe! 
Suche solange (kläglich) im Inet,
denn in meinem teuer bezahlten Balzert stehts nicht drin...
(und an alle, die immer noch wach sind (halb vier!) => Gutenacht.)


----------



## Murray (2. Dez 2005)

Willst Du einfach nur den Inhalt einer Datei sequentiell (oder schreibt man jetzt sequenziell?) in ein Array lesen? Das geht so:

```
FileInputStream in = new FileInputStream( file);
int len = (int)file.length();
byte buf[] = new byte[len];
in.read( buf, 0, len);
in.close();
```
Damit kopierst Du natürlich die ganze Datei in den Speicher, was bei sehr grossen Dateien evtl. ein Problem sein könnte.


----------



## tobiasbeil (2. Dez 2005)

Hast du eine Idee wieso file.length() bei mir nicht geht ?


----------



## Murray (2. Dez 2005)

Nee, keine Ahnung - was heisst denn - es geht nicht?


----------



## MichiM (2. Dez 2005)

try - catch um die File-Operationen, dann sollte es gehen.


----------



## tobiasbeil (2. Dez 2005)

ach nee,

stimmte soweit alles, habe nur in.length() ausprobiert statt file.length().

sorry für das durcheinander.


----------



## tobiasbeil (3. Dez 2005)

folgeproblem:

meine inputdatei ist exakt 36 bytes gross.
wenn ich file.length() anwende wird 41 ausgegeben.


```
try {
    FileInputStream inFile = new FileInputStream(pFilename);
    byte aByte;
    int size_of_file = (int)pFilename.length();
    System.out.println("Input file size is "+size_of_file+" bytes.");
    inFile.close();
}
catch(FileNotFoundException Exception) {
}
catch(IOException Exception) {
}
```

EDIT:
Testfile sieht exakt so aus:

```
012345678901234567890123456789012345
```

"ls -l | grep testfile" gibt bei grösse 36 an.

kann das mal jemand "reproduzieren" bitte ?


----------



## Murray (3. Dez 2005)

Das kommt davon, wenn man unvollständigen Code postet :wink: 

In meinem Beispiel stand file für ein Objekt vom Typ java.io.File, nicht für einen String. Was Du jetzt ausgibst, ist die Länge des Dateinamens.

Besser:


```
String fileName = "testfile.txt";
File file = new File( fileName);
System.out.println( file.getAbsolutePath() + ".length() = " + file.length());
```


----------



## tobiasbeil (3. Dez 2005)

sag mal wollt ihr mich an der nase rumführen ?

wenn ich also pFilename.length() eintippe kommt die länge des dateinamens,
aber wenn ich inFile.legth() eingeben kommt das was ich schon weiter oben
bemängelt habe: "the method length() is undefined for the type FileInputStream."

Und Klasse File kann zwar .length(), aber kein .read().

Postet mal lieber alle eure imports, die will ich sehen.


----------



## Roar (3. Dez 2005)

tobiasbeil hat gesagt.:
			
		

> sag mal wollt ihr mich an der nase rumführen ?
> 
> wenn ich also pFilename.length() eintippe kommt die länge des dateinamens,
> aber wenn ich inFile.legth() eingeben kommt das was ich schon weiter oben
> ...


also sorry wenn du nicht richtig lesen willst oder kannst....
du siehst doch dass Murray die Methode auf sein File angewendet hast....


----------



## tobiasbeil (3. Dez 2005)

Roar hat gesagt.:
			
		

> also sorry wenn du nicht richtig lesen willst oder kannst....
> du siehst doch dass Murray die Methode auf sein File angewendet hast....



danke, habe ich lesen wollen und können.
und wieso kann ich das nicht auch ?
siehe fehlermeldung.


----------



## tobiasbeil (3. Dez 2005)

so ich hab jetzt die richtige lösung.

wenn man ein file lesen möchte und vorher die grösse wissen will,
dann muss man anscheinend beide klassen File, FileInputStream benutzen.

mit aFile.length() bekommt man die korrekte grösse in bytes,
somit kann ich meine anforderung einen zähler zu realisieren gerecht werden.
den rest erledigt aFileInputStream.read() und .close() zum dateiinhalt auslesen und danach schliessen.

ich hätte angenommen, dass man all dies mit einer klasse erledigen kann,
aber File hat kein read() oder close(), nur allgemeine statusabfragen und so.


----------

