RandomAccessFile.read(byte[] b)

alexgw

Mitglied
Hallo an alle,

ich möchte eine Datei in ein Byte Array konvertieren. Dazu habe ich die Klasse RandomAccessFile verwendet. Laut API wird zur Befüllung des Byte Arrays die Methode int read(byte[] b) verwendet.
Ich habe mit Eclipse festgestellt, dass die Methode die Befüllung meines Byte Arrays fehlerhaft ausführt. Habe ich etwas falsch gemacht?


Java:
FiletoByteArray(String filename) throws  Exception{

		File file = new File(filename);
		long length = file.length();
		System.out.println("LengthofFile:"+length);
		int size = 256;
		RandomAccessFile myfile=new RandomAccessFile(filename,"rw");
		byte b[] = new byte[size];

	       myfile.read(b);//Hier gibt es Probleme.  Das Array wird nicht richtig gefuellt! 

                myfile.close();
		
}
 
Zuletzt bearbeitet:
Zeile 8 müsste lauten:
Java:
 byte b[] = new byte[(int) length];

Ich würde auch noch ein myFile.seek(0) vor dem Lesen machen damit er wirklich vom Anfang her liest.

Bernd
 
Yep. Oder jedoch read(byteArray, startPosition, anzahl bytes).

Steht auch so in der API. Ich denke nicht das read(b) kontrolliert ob das Array nicht vielleicht schon voll ist.

Es wäre außerdem hilfreich wenn du uns die Exception geben könntest. Ich gehe jedoch von einer Index out of bounds Exception aus.
 
Danke. Leider zeigt er immer noch negative Werte im Byte Array bei Eclipse an. Ich habe deine Verbesserungen übernommen. Es wird keine Exception geworfen. Nun sieht es so aus:

Java:
FiletoByteArray(String filename) throws  Exception{
 
        File file = new File(filename);
        long length = file.length();
        System.out.println("LengthofFile:"+length);
        
        RandomAccessFile myfile=new RandomAccessFile(filename,"rw");
       byte b[] = new byte[(int) length];
	myfile.seek(0);
 
           myfile.read(b);//Hier gibt es Probleme.  Das Array wird nicht richtig gefuellt! 
 
           myfile.close(); //Stream close 
           System.out.println("3. Byte "+b[2]+"\n");//Anzeige des fehlerhaften 3. Byte im Array in Dezimalform
		
}
 
Zuletzt bearbeitet:
was hast du denn für eine Datei?
um nicht alles zu kompliziert zu machen erstelle dir eine neue mit 5 Bytes: 2, 13, 42,-100, 99
füge auch die Datei hier als Anhang hinzu, dann kann sie jeder testen

was genau wird nun gelesen? was ist ein 'fehlerhaftes Byte'? es werden doch kaum sonstige Zufallswerte wie 30 oder 75 gelesen

edit:
ach wozu lange warten, funktioniert selbstverständlich bestens:
Java:
public class Test2 {
    public static void main(String[] args)     throws Exception   {
        String f = "test.data";
        FileOutputStream fout = new FileOutputStream(f);
        fout.write(2);
        fout.write(13);
        fout.write(42);
        fout.write(-100);
        fout.write(99);
        fout.close();
        filetoByteArray(f);
    }

    private static void filetoByteArray(String filename)      throws Exception  {

        File file = new File(filename);
        long length = file.length();
        System.out.println("LengthofFile:" + length);

        RandomAccessFile myfile = new RandomAccessFile(filename, "rw");
        byte b[] = new byte[(int)length];
        myfile.seek(0);

        myfile.read(b);// bestens

        myfile.close(); // Stream close
        System.out.println("3. Byte " + b[2] + "\n");// bestens
        System.out.println(Arrays.toString(b));
    }

}
 
Zuletzt bearbeitet von einem Moderator:
Yep. Oder jedoch read(byteArray, startPosition, anzahl bytes).

Steht auch so in der API. Ich denke nicht das read(b) kontrolliert ob das Array nicht vielleicht schon voll ist.

read(byteArray) macht das schon in dem es read(byteArray,0,byteArray.length) aufruft.

Was Du meinst ist die Methode "readFully" welche solange wartet, bis byteArray.length bytes gelesen wurden. Das ist bei einem RandomAccess-File aber eher hm... Käse weil die Daten immer da sind.

Bernd
 
Leider zeigt er immer noch negative Werte im Byte Array bei Eclipse an.

Das ist klar, bei der Ausgabe via sysout werden bytes als "signed" (also Vorzeichenbehaftet) behandelt.

Was Du machen musst ist das Byte vor der Austabe mit 0xFF zu maskieren.

Java:
	byte b = (byte) 200;
	System.out.println(b);
	System.out.println(b & 0xFF);

Bernd
 
Was Du meinst ist die Methode "readFully" welche solange wartet, bis byteArray.length bytes gelesen wurden. Das ist bei einem RandomAccess-File aber eher hm... Käse weil die Daten immer da sind.

Das ist kein Käse. Bei allen [c]read()[/c]-Methoden, die ein int zurückgeben, muss man dieses prüfen. Das hat nichts damit zu tun, dass "Daten immer da sind" (was auch immer das bedeuten soll) oder nicht. Diese Prüfung entfällt bei [c]readFully()[/c].
 
Danke an alle.:applaus: Das Maskieren hatte ich nicht bedacht. Ich hatte den Debugger von Eclipse verwendet und der maskiert leider das Byte nicht. Es können nur Werte bis 127 unmaskiert richtig dargestellt werden. Deshalb kam es bei mir zur Verwirrung. Vielen Dank.

Meine Testdatei hatte eine 144 drin:

public static void main(String[] args) throws Exception {
String f = "test.data";
FileOutputStream fout = new FileOutputStream(f);
fout.write(2);
fout.write(13);
fout.write(144);
fout.write(-100);
fout.write(99);
fout.close();
filetoByteArray(f);
}
 
Zuletzt bearbeitet:
Das ist kein Käse. Bei allen [c]read()[/c]-Methoden, die ein int zurückgeben, muss man dieses prüfen. Das hat nichts damit zu tun, dass "Daten immer da sind" (was auch immer das bedeuten soll) oder nicht. Diese Prüfung entfällt bei [c]readFully()[/c].

Stimmt, Du hast recht. Ich war da in einer anderen Sprache - dort kann man hinter dem Dateiende lesen und bekommt einen leerbuffer zurück; in Java kommt da nix.

Mein Multithreading taugt einfach nix mehr ;(

Bernd
 

Zurück
Oben