Ist ein Zeichen 1 byte oder 2 Byte in Java?
Dachte ich Zeichen in java 16 bit, wie vorgeschlagen, in java-doc. Ist es nicht der Fall für strings? Ich habe einen code speichert ein Objekt in eine Datei:
public static void storeNormalObj(File outFile, Object obj) {
FileOutputStream fos = null;
ObjectOutputStream oos = null;
try {
fos = new FileOutputStream(outFile);
oos = new ObjectOutputStream(fos);
oos.writeObject(obj);
oos.flush();
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
oos.close();
try {
fos.close();
} catch (Exception e) {
e.printStackTrace();
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
Im Grunde habe ich versucht, das speichern einer Zeichenfolge "abcd"
im Datei -"output"
, als ich öffnete output
mit einem editor gelöscht und die keine string-Teil, was übrig bleibt, ist nur die Zeichenfolge "abcd", die 4 bytes in total. Weiß jemand, warum? Macht java automatisch spart Platz durch die Verwendung von ASCII statt UNICODE-Strings, die kann unterstützt werden, indem ASCII? Dank
- Nur so ein Gedanke: könnte es nicht sein, dass Java speichert in UTF-8?
- Ja, genau - es speichert Strings im modifizierten UTF-8...
Du musst angemeldet sein, um einen Kommentar abzugeben.
(Ich glaube von "keine string-Teil" Sie beziehen sich auf die bytes, die ObjectOutputStream sendet, wenn Sie ihn erstellen. Es ist möglich, dass Sie nicht verwenden möchten, ObjectOutputStream, aber ich weiß nicht Ihren Anforderungen.)
Nur zur info, Unicode und UTF-8 sind nicht das gleiche. Unicode ist ein standard, der angibt, unter anderem, welche Zeichen verfügbar sind. UTF-8 ist eine Zeichenkodierung legt fest, wie diese Zeichen sind physisch codiert, in 1s und 0s. UTF-8 verwenden können 1 byte für ASCII - (<= 127) und bis zu 4 bytes zu repräsentieren, andere Unicode-Zeichen.
UTF-8 ist eine strikte Obermenge von ASCII. Also, auch wenn Sie eine UTF-8-Codierung für eine Datei und schreiben Sie "abcd", es enthält nur die vier bytes: Sie haben die gleichen physikalischen Codierung in ASCII, wie Sie in UTF-8.
Ihre Methode verwendet
ObjectOutputStream
das wirklich eine deutlich andere Codierung als ASCII-oder UTF-8! Wenn Sie Lesen der Javadoc sorgfältig, wennobj
ist ein string, der bereits eingetreten in den Strom, nachfolgende AufrufewriteObject
bewirkt, dass ein Verweis auf die Vorherige string emittiert werden, möglicherweise verursacht viel weniger bytes geschrieben werden, im Falle von wiederholten Zeichenfolgen.Wenn Sie ernsthaft über das Verständnis dieser, Sie sollten wirklich verbringen eine gute Menge Zeit mit Lesen über Unicode und character encoding Systeme. Wikipedia hat einen hervorragenden Artikel auf Unicode als start.
Ja, die
char
ist nur Unicode, die im Kontext der Java-runtime-Umgebung. Wenn Sie möchten, es zu schreiben, mit 16-bit-Kodierung verwenden, eineFileWriter
.FileWriter
, weil es keine Möglichkeit gibt die Kodierung und nur unterstützt die Standard-Kodierung. Die (leider mehr verbose)new OutputStreamWriter(new FileOutputStream(file), encoding)
ist die bessere Wahl.Wenn Sie einen Blick auf die Quelle der Zeichenfolge ist, wird es beachten Sie, dass es Anrufe DataOutput.writeUTF zu schreiben Saiten. Und wenn Sie Lesen, dass Sie finden, dass heraus Sie geschrieben sind, als "modifizierte UTF-8". Die Einzelheiten sind langwierig, aber wenn Sie nicht verwenden, nicht-7-bit-ascii, ja, es dauert ein byte. Wenn Sie möchten, dass die blutigen details Blick auf die EXTREM lange javadoc in DataOutput.writeUTF()
Können Sie daran interessiert zu wissen, es ist ein
-XX:+UseCompressedStrings
option Java Update 21 performance-release und höher. Dies ermöglicht eine Zeichenfolge verwenden, die einebyte[]
für Saiten, die nicht brauchen, einchar[]
Trotz der Java Hotspot VM Options Leitfaden darauf hindeutet, kann es sein, standardmäßig aktiviert, dies kann nur für die performance-Versionen. Es nur scheint zu funktionieren für mich, wenn ich es einschalten explizit.
So erwarten Sie
16*4=64 bits = 8 bytes
- Datei? Mehr als UTF-8 oder ASCII-Codierung. Sobald die Datei in eine Datei geschrieben werden. Der Speicher (in Form von Raum -) management ist bis auf das Betriebssystem. Und der code nicht haben die Kontrolle über es.