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.
Ihre Datei befindet sich in ASCII, aber Sie versuchen, sie zu lesen, als wäre sie binär. –
was meinst du? Ich muss jeden Wert zu kurz analysieren? –
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 –