Frage

ich einen Output schriebe, genau dies im Output Schnittstelle bemerkt,

   public abstract void write(int b) throws IOException;

Dieser Aufruf ein Byte in den Stream schreiben, aber warum dauert es ganze Zahl als Argument?

War es hilfreich?

Lösung

Eigentlich ein bisschen in letzter Zeit mit Bytes arbeiten ich habe und sie können lästig sein. Sie up-Umstellung auf Ints beim geringsten Anlass und es gibt keine Bezeichnung eine Zahl in ein Byte drehen - zum Beispiel, wird 8l geben Ihnen einen Long-Wert 8, aber für Byte Sie zu sagen haben (Byte) 8

Hinzu kommt, dass, werden sie (ziemlich) intern immer als ints gespeichert werden, wenn Sie einen Array verwenden (und vielleicht sogar dann .. nicht sicher).

Ich denke, sie nur so ziemlich davon ausgehen, dass der einzige Grund, ein Byte zu verwenden, ist i / o, wo man tatsächlich 8 Bits benötigen, aber intern erwarten sie Sie immer Ints verwenden.

By the way, kann ein Byte schlechter durchführen, da es immer maskiert werden muss ...

Wenigstens habe ich das Lesen erinnern, dass vor Jahren haben sich inzwischen geändert könnten.

Als Beispiel Antwort auf Ihre Frage, wenn eine Funktion (f) ein Byte nahm, und hatte zwei Bytes (b1 und b2), dann:

f(b1 & b2)

würde nicht funktionieren, weil b1 b2 in einem int aufwärts konvertiert wäre, und die int kann nicht nach unten konvertiert wird automatisch (Genauigkeitsverlust). So möchten Sie Code haben:

f( (byte)(b1 & b2) )

Welche irritierend bekommen würde.

Und nicht die Mühe zu fragen, warum b1 b2 up-Konvertiten - Ive an, dass ein wenig fluchen wurde in letzter Zeit selbst

Andere Tipps

Sie können also EOF-Signal:

"Beachten Sie, dass () gibt einen int-Wert zu lesen. Wenn die Eingabe einen Strom von Bytes ist, warum nicht lesen () einen Byte-Wert zurückgeben? Mit einem int als Rückgabetyp gelesen werden kann () zu verwenden -1 um anzuzeigen, dass er das Ende des Stroms erreicht hat. "

http://java.sun.com/docs/ Bücher / tutorial / essential / io / bytestreams.html

nach javadoc Output werden die 24 höherwertigen Bits von dieser Funktion ignoriert. Ich denke, das Verfahren aus Kompatibilitätsgründen vorhanden ist: Sie daher zunächst nicht konvertieren müssen auf Byte und Sie können einfach eine ganze Zahl passieren

.

Bezug

Die Java Iostream Klassen haben seit 1.0 ein Teil von Java gewesen. Diese Klassen nur mit 8-Bit-Daten umgehen. Meine Vermutung ist, dass die Schnittstelle wie diese wurde so konzipiert, dass die eine write (int b) Methode wäre für int, short, byte und char Werte aufgerufen werden. Diese sind alle in einen int gefördert. In der Tat, da die meisten JVMs auf 32-Bit-Maschinen laufen, ist die int primitive die effizienteste Art zu behandeln. Der Compiler ist frei zum Speichern von Typen wie Bytes unter Verwendung von 32 Bits sowieso. Interessanterweise byte [] wirklich als eine Folge von 8-Bit-Bytes gespeichert. Dies macht Sinn, da eine Reihe recht groß sein könnte. Doch im Fall von Einzel primitiver Werte wie int oder Byte, der ultimative Raum zur Laufzeit besetzt ist eigentlich egal, solange das Verhalten mit der Spezifikation übereinstimmt.

Mehr Hintergrund:

http://www.java-samples.com/showtutorial.php ? tutorialid = 260

Die Annahme für die iostream-Klassen ist, dass der Anrufer nur wirklich über untersten 8 Bits von Daten kümmert sich auch dann, wenn in einem int vorbei. Das ist in Ordnung, solange der Anrufer weiß, es ist wirklich mit Bytes zu tun, aber es wird zu einem Problem, wenn Daten zugrunde liegt, ist wirklich Text, der eine andere Zeichencodierung wie Multi-Byte Unicode verwendet. Aus diesem Grunde ist die Reader-Klassen Art und Weise mit Java 1.1 zurück eingeführt wurden. Wenn Sie sich über Textdaten und Leistung sorgen, sind die Iostream Klassen schneller, aber die Reader-Klassen sind mehr tragbar.

Vielleicht ist es, weil Bytes standardmäßig signiert sind, und Dateien speichern die Bytes als unsigned Werte. Deshalb read() ein int zurückgibt - 255 zu geben, statt -1 für $ FF. Das Gleiche gilt für write(int), erhalten Sie $ FF als 255 in einem Byte nicht speichern kann.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top