2 Stimmen

Lesen der ersten 10 Bytes einer Datei in Java

    for (String name : filenames) {   
FileInputStream in = new FileInputStream(input.readUTF());   
    int byteCounter = 0;   
    int rowCounter = 0;   
    long bufferCounter = 0;   
    byte[] b = new byte[8];   
    int read;   

    //in.skip(10);   
    //while((read = in.read()) != -1){   
    while((read = in.read(b, 0, 10)) != -1){   
        byteCounter ++;   
        if (byteCounter != 1000){   
            if (rowCounter == 16){   
                System.out.println("\n");   
                rowCounter = 0;   
            }   
        System.out.print(Integer.toHexString(read) + "\t");   
            bufferCounter ++;   
            rowCounter ++;   
        }else{   
                byteCounter = 0;   
                try{   
                    Thread.sleep(200);   
                }catch(InterruptedException e) {   
                }   
        }   
    }   
    System.out.println("\n"+"================"+"\n");   
}  

Hallo, ich habe gehofft, dass mir jemand bei einem Problem helfen kann, das ich habe. Ich versuche, mein Programm dazu zu bringen, die ersten 10 Bytes einer bestimmten Datei einzulesen. Ich kann es mit skip() zum Laufen bringen, aber offensichtlich bewirkt dies das Gegenteil von dem, was ich will (es entfernt stattdessen die ersten 10) Ich habe überall gesucht, ohne Erfolg, wenn Sie mir helfen können, wäre das großartig. Sie können wahrscheinlich sehen, dass ich bereits versucht habe, read(b, off, len) in den Code einzugeben, aber das erzeugt nur zufällige Zeichen als Ausgabe und nicht die tatsächlichen Hex-Zeichen, die ich haben möchte 74 65 71 usw. (Bearbeiten: Diese zufälligen Zeichen scheinen der Hex-Code für die Anzahl der gelesenen Bytes zu sein. Für eine Textdatei, die 23 Hex-Zeichen enthält, wird also a a 3 ausgegeben (oder in anderen Worten: 10,10,3 = 23)

0 Stimmen

Ich bin mir ziemlich sicher, dass es im Falle von in.read(b, 0, 10) weniger als 10 Bytes zu lesen. Das passiert praktisch nie, aber es gibt keine Garantie.

0 Stimmen

Ich sehe, dass mein vorheriger Kommentar vielleicht nicht klar war: Ich meine: Es passiert praktisch nie für den Fall, dass mehr Bytes verfügbar sind da die Daten von der Festplatte in Vielfachen der Sektorgröße übertragen werden.

0 Stimmen

:S Das hat mich jetzt völlig aus dem Konzept gebracht. Willst du damit sagen, dass irgendetwas an meiner Kodierung falsch ist oder fehlt? Tut mir leid, dass ich das fragen muss, aber du weißt schon...

3voto

maaartinus Punkte 42477
byte[] b = new byte[10];
new DataInputStream(new FileInputStream(input.readUTF())).readFully(b);

Dies ist der einfachste Weg, aber er führt zu Fehlern, wenn weniger als 10 Bytes zur Verfügung stehen. Falls Sie das nicht wollen, verwenden Sie eine Schleife. Irgendwie verstehe ich nicht, was Sie tun, es sieht wirklich nicht wie das Lesen der ersten 10 Bytes: if (byteCounter != 1000)

1voto

lweller Punkte 10763

Das Problem liegt hier

System.out.print(Integer.toHexString(read) + "\t");

read enthält die Anzahl der tatsächlich vom Stream gelesenen Bytes. Die Bytes befinden sich im Array b .

Übrigens: Ihr Array hat eine Größe von 8. Sie sollten es auf 10 erhöhen, wenn Sie 10 Bytes lesen wollen!

0 Stimmen

Hallo Iweller, danke für die schnelle Antwort. Ja, ich habe das mit der 8 bemerkt (das bin nur ich, der verzweifelt versucht, es zum Laufen zu bringen, lol). Ich habe versucht, es zu ändern, so dass es jetzt heißt: System.out.print(Integer.toHexString(b) + " \t "); aber das führt zu einem Fehler "toHexString(int) in java.lang.Integer kann nicht auf (byte[]) angewendet werden".

0 Stimmen

0 Stimmen

Wo genau würde der encodeHexString(b)-Teil hingehen? Tut mir leid, wenn das wie eine dumme Frage klingt, aber ich habe versucht, ihn in den system.out.println-Teil und an andere Stellen zu setzen, aber ohne Erfolg :S

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X