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:

Bernd Hohmann

Top Contributor
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
 

XPrototypeX

Aktives Mitglied
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.
 

alexgw

Mitglied
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:
S

SlaterB

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

Bernd Hohmann

Top Contributor
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
 

Bernd Hohmann

Top Contributor
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
 

musiKk

Top Contributor
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].
 

alexgw

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

Bernd Hohmann

Top Contributor
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
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
S RandomAccessFile durch bytearrayinputstream ersetzen Allgemeine Java-Themen 4
A RandomAccessFile - "insert" implementieren? Allgemeine Java-Themen 4
Iron Monkey RandomAccessFile - Bestimmte Filesize begrenzen Allgemeine Java-Themen 4
H RandomAccessFile - Zeile finden Allgemeine Java-Themen 5
C RandomAccessFile aus Jar Allgemeine Java-Themen 7
T Mit Applet per RandomAccessFile Datei öffnen Allgemeine Java-Themen 3
reibi RandomAccessFile Puffer schreiben Allgemeine Java-Themen 2
J RandomAccessFile readLine(); Allgemeine Java-Themen 5
R RandomAccessFile springt zum Ende Allgemeine Java-Themen 11
P Nochmal RandomAccessFile Allgemeine Java-Themen 6
N RandomAccessFile überschreibt Inhalt Allgemeine Java-Themen 3
A RandomAccessFile - Bytes vom Anfang der Datei löschen Allgemeine Java-Themen 32
B Probleme mit RandomAccessFile Allgemeine Java-Themen 3
R Knacken bei RandomAccessFile Allgemeine Java-Themen 5
K RandomAccessFile und readUTF/writeUTF Allgemeine Java-Themen 4
T RandomAccessFile im .jar Allgemeine Java-Themen 2
M RandomAccessFile Allgemeine Java-Themen 10
X Input/Output InputStream/Scanner(System.in) read()/hasNextLine() block unterbrechen Allgemeine Java-Themen 7
D Read JSON File Problem Allgemeine Java-Themen 9
S Read End Dead Allgemeine Java-Themen 2
S Read End Dead Allgemeine Java-Themen 1
T ImageIO.read -> Can`t read input file Allgemeine Java-Themen 11
thet1983 Input/Output read properties file from classpath Allgemeine Java-Themen 3
H Security Manager (IIOException: Can't read input file!) Allgemeine Java-Themen 2
I Javafx Open/Read und Tree Funktion Allgemeine Java-Themen 14
M Read end ded [PipedInputStream...] Allgemeine Java-Themen 0
M Threads synchroner Zugriff (add/delete/read) auf eine Liste Allgemeine Java-Themen 6
T InvalidClassException - Read null attempting to read class descriptor for object Allgemeine Java-Themen 8
1 Check read/write permission for file Allgemeine Java-Themen 4
J write / read Problem Allgemeine Java-Themen 9
E Durch System.in.read() blockierten Thread stoppen Allgemeine Java-Themen 10
N read streams umleiten Allgemeine Java-Themen 2
G Read only Eclipse- Datei Allgemeine Java-Themen 5
W Konflikt byte->int, in.read->arraycopy Allgemeine Java-Themen 7
M BufferedReader.read(char[] cbuf) liefert falsche Werte? Allgemeine Java-Themen 4
A Probleme mit ImageIO.read( . ) Allgemeine Java-Themen 12
S NoClassDefFoundException - ImageIO.read - Applet Allgemeine Java-Themen 3
S java.io.InputStream.read(byte[] b) überschreiben Allgemeine Java-Themen 33
A System.in.read() Problem Allgemeine Java-Themen 6
R read/readline blockiert Allgemeine Java-Themen 5
F Zu große Werte beim byteweisen Lesen mit BufferedReader.read Allgemeine Java-Themen 5
C ImageIO die read-Methode liefert mir ein null- Wert zurück Allgemeine Java-Themen 10
M InputStream.read abbrechen Allgemeine Java-Themen 2
LucasGlockner Effizienter byte-Zugriff auf ein long[]-Array Allgemeine Java-Themen 8
Encera Größe eines Objektes in Byte berechnen Allgemeine Java-Themen 2
M Optimierung einer Methode (byte-Geraffel) Allgemeine Java-Themen 2
Noahscript Aus einem byte Array Steuerungszeichen und Code bekommen und ersetzen Allgemeine Java-Themen 3
Thallius unsigned byte Allgemeine Java-Themen 18
N Byte Array in Java "dekomprimieren" Allgemeine Java-Themen 3
kodela Datentypen byte als unsigned interpretieren Allgemeine Java-Themen 23
W String -> byte[] -> String - Sieht jemand was ich nicht sehe? Allgemeine Java-Themen 10
TheWhiteShadow 2D-Grafik GIF Library mit byte output Allgemeine Java-Themen 10
K Data Konverter - Probleme mit Byte[] Kodierung Allgemeine Java-Themen 3
kodela Byte Order Mark (BOM) bei readLine() ignorieren Allgemeine Java-Themen 5
A Byte zu String Allgemeine Java-Themen 4
RalleYTN Datentypen Unsignierter Byte zum signierten Byte Allgemeine Java-Themen 2
X Datentypen Byte geht nicht höher als 126 auch nicht mit casten? Allgemeine Java-Themen 22
R Byte Array Zeichensuche Allgemeine Java-Themen 6
M Null byte in verschiedenen charsets Allgemeine Java-Themen 2
S Byte Array welches in Laufzeit aufgelöst wird // Objekt Array Allgemeine Java-Themen 3
O Byte-Array zu String Allgemeine Java-Themen 7
D Decodierung von Mp3-byte[] Allgemeine Java-Themen 4
A ByteBuffer.get(byte[] dst,int offset,int length) Allgemeine Java-Themen 2
P Datentypen Warum überhaupt Byte ? Allgemeine Java-Themen 12
P Datentypen String-Daten zu Byte-Zahlen konvertieren - Komme nicht weiter nach vielem versuchen :-/ Allgemeine Java-Themen 7
E Byte zu String & umgekehrt Allgemeine Java-Themen 3
B BufferedWriter in InputStream oder Zeichen-Stream in Byte-Stream Allgemeine Java-Themen 5
M Chart per byte[] in JSP anzeigen Allgemeine Java-Themen 4
E int in byte Allgemeine Java-Themen 6
R ArrayList byte[] abspeichern Allgemeine Java-Themen 4
S byte [] in string und zurück konvertieren Allgemeine Java-Themen 2
G byte ? : Allgemeine Java-Themen 7
E Byte-Array to String: Zeichenkaputt Allgemeine Java-Themen 11
R In einem Byte-Array nach einer gewissen Zahlenfolge suchen Allgemeine Java-Themen 7
hdi Speicherbelegung byte, short, int Allgemeine Java-Themen 8
J byte - hex - byte.. casten Allgemeine Java-Themen 8
R byte[] to String Konvertieren Allgemeine Java-Themen 14
A Input/Output Buffered Image zu Byte Array und zurück konvertieren Allgemeine Java-Themen 4
M byte array splitten Allgemeine Java-Themen 3
J Hex-String zu byte transformieren Allgemeine Java-Themen 7
T Zu doof für byte-Umrechnung ... Allgemeine Java-Themen 3
W CRC32 aus byte array Allgemeine Java-Themen 5
F byte[] aus einem BufferedImage Allgemeine Java-Themen 3
L byte -> byte[1] -> byte Allgemeine Java-Themen 2
P Einzelne Bits in einem Byte-Array setzen Allgemeine Java-Themen 2
Kr0e Synchronisieren: boolean,byte,char ? Allgemeine Java-Themen 2
S Überprüfung/Parsen eines Byte-Arrays Allgemeine Java-Themen 9
Semox Byte-Manipulation eines Bildes Allgemeine Java-Themen 7
Meldanor For-Schleifen - byte statt int? Allgemeine Java-Themen 11
C int zu byte cast - verständnis Allgemeine Java-Themen 3
R int to byte[] Array Allgemeine Java-Themen 4
MQue byte[] Array to Integer Allgemeine Java-Themen 4
MQue Byte to Int convertieren Allgemeine Java-Themen 2
R Double Werte aus byte[] auslesen Allgemeine Java-Themen 5
W Verwendung von byte Allgemeine Java-Themen 9
G zu lange Byte code dateien Allgemeine Java-Themen 6
G String in byte- Array Allgemeine Java-Themen 3
E Byte [] nach hex, dann nach dec Allgemeine Java-Themen 2
A Performance: byte[] in byte[][][] konvertieren Allgemeine Java-Themen 2
G 2 x byte zusammenkopieren Allgemeine Java-Themen 7

Ähnliche Java Themen

Neue Themen


Oben