2017-06-29 3 views
-1

Ich habe eine Aufgabe von RandomAccessFile (die aus Kurzschlüssen im Binärformat dargestellt) die Nummer in 1. Position und die Nummer in 5. Position zu drucken. Meine Datei sieht wie folgt aus:Drucken kurze Zahlen aus RandomAccessFile in Java

0011 
1100 
0001 
1000 
1110 
1010 
0101 
1111 

und der Code:

RandomAccessFile file = new RandomAccessFile("data.txt", "r"); 
    try { 
     int size = (int)file.length()/2; 
     short[] arr = new short[size]; 
     int pos = 0; 
     file.seek(pos); 
     for (int i = 0; i < size; i++) { 
      arr[i] = file.readShort(); 
      pos += 2; 
      file.seek(pos); 
     } 
     System.out.println(arr[0] + " " + arr[4]); 
    } catch (IOException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } 

Für Antwort i "12336 12336" bekam. Wo ist das Problem. Ich kenne mich mit den Streams nicht aus und habe erst kürzlich damit angefangen.

+1

Ihre Datei befindet sich in ASCII, aber Sie versuchen, sie zu lesen, als wäre sie binär. –

+0

was meinst du? Ich muss jeden Wert zu kurz analysieren? –

+0

Kann ich etw wie folgt verwenden: 'arr [i] = Short.parseShort (file.readLine(), 2); vorausgesetzt, dass die Datei meine randomaccessfile ist und arr ein kurzes Array ist –

Antwort

2

Sie sagen, Ihre Datei wie folgt aussieht:

0011 
1100 
0001 
1000 
1110 
1010 
0101 
1111 

Ist dies eine Textdarstellung Sie die Datei erhalten bei der Anzeige zum Beispiel mit Notepad? Oder sehen Sie es mit einer Binary-Editor? Kurz gesagt, sprichst du über text oder bytes?

Es scheint mir, dass die Datei in einem Texteditor so aussieht. Wenn das der Fall ist, dann sind dies nicht bytes. Eine Textdatei wird immer mit einer Kodierung kodiert, übliche Kodierungen sind UTF-8 oder ASCII. Es ist wahrscheinlich, dass Ihr Text mit ASCII codiert ist. In ASCII wird der Text 0 durch die Bytes dargestellt:

0011 0000 

So eine Textzeile wie 0011\r\n mit ASCII codiert, wenn die raw bytes Betrachtung ist eigentlich:

00110000 00110000 00110001 00110001 00001101 00001100 

Die \r\n sind unsichtbare Symbole, die bedeuten, newline (Wagenrücklauf, Zeilenumbruch). Es sind viele ASCII Tabellen verfügbar, zum Beispiel here.

Also, wenn Sie jetzt die Datei lesen und readShort verwenden, dann werden Sie tatsächlich die Bytes der Datei lesen und interpretieren sie als short, das eine 16-Bit-Zahl. Die ersten 16 Bits sind:

00110000 00110000 

Wenn wir dies als short interpretieren wird die Zahl sein: 12336. Sie können es versuchen, mit:

System.out.println(0b0011000000110000); 

Die 0b bedeutet interpret the following byte code as number.

Okay, das ist die Quelle des Problems. Die Lösung ist, interpretiere den Text nicht als Bytes, sondern als Text. Text besteht aus mehreren char s. Sie können also die readChar Methode anstelle von readShort verwenden. Sie können auch einfach die Methode readLine verwenden, um die gesamte Zeile zu lesen. Wenn Sie die readChar Methode verwenden, erhalten Sie eine char mit Inhalt 0.Sie können nun diese als short parsen von Short.valueOf(...) mit:

arr[i] = Short.valueOf(file.readChar()); 

Allerdings gibt es ein kleines Problem gelassen. Irgendwann, wenn Sie zum Zeilenende kommen, werden Sie das \r\n in der Datei lesen und auch sein short-representation in das Array einfügen. Sie können dieses Problem beheben, indem Sie diesen genauen Wert Überspringen oder durch readLine mit und teilen dann die Linie durch seine Zeichen:

String line = file.readLine(); 
for (char character : line.toCharArray()) { 
    arr[i] = Short.valueOf(character); 
    i++; 
} 

jedoch bei diesem Ansatz Ihre i falsch ist, wie Sie dann \r\n überspringen würde, aber es ist nicht in der übersprungenen Berechnung von size. Zur Lösung Ihres Problems benötigen Sie jedoch keine i. Sie könnten einfach eine LinkedList oder etwas anderes verwenden.

1

Sie sind falsch über Ihre Aufgabe informiert. Klärung suchen. Wenn diese Datei wirklich binär wäre, wären dies keine Kurzschlüsse, sondern 4-Bit-Nibbles mit den Werten 3, 12, 1, 8, 14, 10, 5, 15, und es würde keine Zeilenumbrüche geben. Aber ich stimme @ElliotFrisch zu, dass dies binär, nicht binär ASCII-formatiert ist, in diesem Fall sind sie immer noch keine Kurzschlüsse, sondern 4-Bit-Nibbles. Oder möglicherweise sind sie hex shorts mit nur 0 und 1 Ziffern vorhanden. In jedem Fall brauchen Sie eine Klarstellung.

NB:

  1. Sie haben keine RandomAccessFile. Du hast eine Datei. RandomAccessFile ist eine Klasse, und nur eine von mehreren möglichen Möglichkeiten, die Datei zu lesen.

  2. Ihre seek() Anrufe suchen genau, wo Sie bereits sind, in jedem Fall. Sie müssen beim sequentiellen Lesen einer Datei nicht suchen.

+0

Hoppla! Ich machte einen Fehler. Gelegentlich sagte mir mein Lehrer, dass die Datei nicht die Erweiterung ".txt" hat. Die richtige Erweiterung ist ".dat" –

+0

Das sagt uns nichts, ohne dass Sie uns richtig sagen, was * in * der Datei ist. Du kannst es so nennen, wie du willst, aber wenn es eine Binärdatei ist, warum bricht die Zeile? Und warum nur vier Ziffern pro Wert? Klärung noch erforderlich. – EJP