Ist ein Zeichen 1 Byte oder 2 Byte in Java?

8

Ich dachte, Charaktere in Java wären 16 Bit lang, wie in java doc vorgeschlagen. Ist das nicht der Fall für Saiten? Ich habe einen Code, der ein Objekt in einer Datei speichert:

%Vor%

Im Grunde habe ich versucht, eine Zeichenkette "abcd" in die Datei "output" zu speichern, wenn ich output mit einem Editor geöffnet habe und den Teil ohne Zeichenkette gelöscht habe, was nur noch die Zeichenkette "abcd" ist 4 Bytes insgesamt. Wer weiß warum? Speichert java automatisch Speicherplatz, indem ASCII anstelle von UNICODE für Strings verwendet wird, die von ASCII unterstützt werden können? Danke

    
user685275 13.05.2011, 06:44
quelle

5 Antworten

7

(Ich glaube, mit "none string part" beziehen Sie sich auf die Bytes, die ObjectOutputStream beim Erstellen ausgibt. Es ist möglich, dass Sie ObjectOutputStream nicht verwenden möchten, aber ich kenne Ihre Anforderungen nicht.)

Just FYI, Unicode und UTF-8 sind nicht das Gleiche. Unicode ist ein Standard, der unter anderem angibt, welche Zeichen verfügbar sind. UTF-8 ist eine Zeichenkodierung, die angibt, wie diese Zeichen physikalisch in 1s und 0s codiert werden sollen. UTF-8 kann 1 Byte für ASCII (& lt; = 127) und bis zu 4 Byte für andere Unicode-Zeichen verwenden.

UTF-8 ist eine strenge Obermenge von ASCII. Selbst wenn Sie eine UTF-8-Kodierung für eine Datei angeben und Sie "abcd" darauf schreiben, enthält sie nur diese vier Bytes: Sie haben die gleiche physikalische Kodierung in ASCII wie in UTF-8.

Ihre Methode verwendet ObjectOutputStream , die tatsächlich eine deutlich andere Codierung als entweder ASCII oder UTF-8 hat! Wenn Sie das Javadoc sorgfältig lesen, wenn obj eine Zeichenkette ist und bereits im Stream aufgetreten ist, verursachen nachfolgende Aufrufe von writeObject einen Verweis auf die vorhergehende zu emittierende Zeichenkette, was möglicherweise dazu führt, dass weniger Bytes in die geschrieben werden Fall von wiederholten Strings.

Wenn Sie das wirklich verstehen wollen, sollten Sie wirklich viel Zeit mit dem Lesen von Unicode- und Zeichencodierungssystemen verbringen. Wikipedia hat einen ausgezeichneten Artikel über Unicode als Anfang.

    
sjr 13.05.2011, 06:51
quelle
2

Ja, das char ist nur Unicode im Kontext der Java-Laufzeitumgebung. Wenn Sie es mit 16-Bit-Codierung schreiben möchten, verwenden Sie FileWriter .

%Vor%     
Pål Brattberg 13.05.2011 06:48
quelle
1

Wenn Sie sich die Quelle von String ansehen, wird bemerkt, dass DataOutput.writeUTF aufgerufen wird, um Strings zu schreiben. Und wenn Sie lesen, dass Sie herausfinden werden, dass sie als "modifiziertes UTF-8" geschrieben sind. Die Details sind lang, aber wenn Sie nicht 7-Bit ASCII verwenden, ja, wird es ein Byte dauern. Wenn Sie die blutigen Details sehen wollen, schauen Sie sich das EXTREM lange javadoc in DataOutput.writeUTF ()

an     
MJB 13.05.2011 06:51
quelle
0

Möglicherweise möchten Sie wissen, dass in der Java Update 21-Leistungsversion und später eine -XX:+UseCompressedStrings -Option vorhanden ist. Dadurch kann String% byte[] für Strings verwenden, die kein char[]

benötigen

Trotz der Java Hotspot-VM-Optionen Anleitung, die darauf hindeutet, dass es sein könnte Standardmäßig ist dies nur für Performance-Releases möglich. Es scheint nur für mich zu funktionieren, wenn ich es explizit aktiviere.

    
Peter Lawrey 13.05.2011 08:08
quelle
-1

Also erwartest du eine 16*4=64 bits = 8 bytes Datei? Mehr als UTF-8 oder ASCII-Codierung. Sobald die Datei in eine Datei geschrieben wurde. Die Speicherverwaltung (im Hinblick auf die Speicherkapazität) hängt vom Betriebssystem ab. Und Ihr Code hat keine Kontrolle darüber.

    
Manimaran Selvan 13.05.2011 07:02
quelle

Tags und Links