2012-04-12 2 views
1

Ich konnte keine Dokumentation zu diesem Thema finden ... Ich möchte in eine Datei eine Reihe von char schreiben und stellen Sie sicher, dass die Größe der Datei # von Zeichen ist Bytes.JAVA - Schreiben von Zeichen in eine Datei in einem Byte pro char

weiß jemand, welche Klasse zu verwenden?

+0

Welche Codierung? ASCII? Was passiert, wenn ein 'char' nicht dargestellt werden kann? UTF-8? Was passiert wenn ein 'char' zwei Bytes ist? –

Antwort

4

Ich möchte in eine Datei eine Reihe von char schreiben und stellen Sie sicher, dass die Dateigröße # von Zeichen Bytes ist.

Ok - so benötigen Sie eine Codierung wählen, die nur ein einziges Byte pro Zeichen verwendet, wie zum Beispiel ISO-8859-1. Erstellen Sie eine , wickeln Sie es in eine OutputStreamWriter Codierung ein und Sie sind weg. Sie müssen jedoch beachten, dass Sie den Bereich der Zeichen begrenzen, die in Ihrer Datei dargestellt werden können.

+0

Jon, es könnte auch eine Erwähnung wert sein, dass dies _only_ Auswirkungen auf externen Speicher hat. Innerhalb des Speichers eines Java-Programms werden diese Ein-Byte-Zeichen weiterhin in Java-Zeichen gepackt, die zwei Bytes lang sind. Der einzige Weg, den ich mir vorstellen kann, um diese Kuriosität herum zu arbeiten, ist, alles in Byte-Arrays zu behalten (und eine Menge Standard-Funktionalität neu zu implementieren). –

+0

@EdwinBuck: Wahrscheinlich sowieso - ich habe von einer JRE-Implementierung gehört, die UTF-8 innerhalb von java.lang.String verwendet hat ... Allerdings vermute ich, dass das OP für Java neu genug ist, um es * am besten nicht einzuführen zu viele verschiedene Ideen gleichzeitig. –

+0

@JonSkeet - wenn ich schreibe: \t \t OutputStreamWriter os = neue OutputStreamWriter (neue FileOutputStream ("Pfad/name_string2.txt")); os.write ('d'); und überprüfen Sie die Dateigröße, es sagt 0 Bytes. – kakush

0

Nehmen Sie ein "Writer"

Writer tun Ausgabe chars

Output Ausgabe

Sie können versuchen, eine andere Codierung tun Bytes zu verwenden . In diesem Fall sollten Sie eine CharSetEncoder liefern, da dies eine onUnmappableCharacter Methode

+0

Verwenden Sie nicht 'FileWriter' - es verwendet die Standardkodierung der Plattform, die eine feste Breite von 1 Byte haben kann oder auch nicht. –

0

Erste herauszufinden, welche Arten von chars hat Sie gehen zu sprechen.

In C ein char sind acht Bits, auch wenn Sie brauchen zwei oder mehr char s in Folge eine Glyphe darstellen, oder in der Mensch-Bedingungen, ein eingegebene Zeichen. Es wird schlimmer, es gibt auch Glyphen, die zwei "typisierte" Zeichen darstellen, wie die zusammengehörenden Glyphen ff und ll, die man oft im Satz sieht.

Wenn Sie sprechen über Cchar s, dann enthält per Definition jede Datei die gleiche Anzahl von Zeichen wie Zeichen. Wenn Sie über eine andere Bedeutung des Wortzeichens sprechen, müssen Sie einige Entscheidungen treffen.

Für den ASCII-Zeichensatz in UTF-8, der bei weitem der beste verfügbare Zeichensatz ist, werden acht Bit-Zeichen garantiert, da er explizit in Webprotokollen unterstützt wird (danke w3c!). Das bedeutet, dass Sie, solange Sie überprüfen, dass jede javachar in Ihrer Zeichenfolge ist weniger als 128 (Ganzzahl-Wert), erhalten Sie eine byte pro char mit UTF-8.

ISO-8859-1 ist ein Zeichensatz, der auch nur einen byte pro Zeichen verwendet.Der Nachteil ist, dass es ISO-8859-1-nicht neigt andere als Microsoft-Systeme der Standardzeichensatz von irgendetwas sein. Sogar innerhalb des Microsoft-Bereichs hat UTF-8 eine Menge Fortschritte gemacht.

Die Kosten für die Konvertierung zwischen den beiden sind nicht übermäßig hoch, aber die Erweiterbarkeit der beiden unterscheiden sich drastisch. Wenn Sie ISO-8859-1 verwenden und Ihnen jemand sagt, dass das nächste Produkt die Sprache "X" unterstützen muss, müssen Sie in einigen Fällen zuerst in einen anderen Zeichensatz konvertieren und dann die Sprachunterstützung hinzufügen. Mit UTF-8 ist eine solche Notwendigkeit, vor dem Hinzufügen von Unterstützung in einen anderen Zeichensatz zu konvertieren, selten. Ich meine sehr selten, so selten, dass man nur Bilder in Betracht ziehen sollte, weil die Sprache wahrscheinlich tot ist, wahrscheinlich nur von historischem Interesse ist und wahrscheinlich als Dialekt von einem kleineren Stamm auf einer Insel, wo die primäre Sprache ist, dokumentiert worden ist hat volle Unterstützung.