byte
Kurz: Der kleinste primitive Ganzzahltyp in Java — 8 Bit, Wertebereich von -128 bis 127.
Genauer: Wird selten explizit genutzt außer bei speicherkritischen Anwendungen (z. B. große Arrays) oder beim Verarbeiten roher Binärdaten (z. B. Byte-Streams beim Dateizugriff). Rechenoperationen mit byte-Werten liefern in Java als Zwischenergebnis automatisch int, ein Rückcast ist dann oft nötig.
Im Detail
Java speichert Ganzzahlen als Zweierkomplement — bei byte bedeutet das: 1 Bit für das Vorzeichen, 7 Bit für den Wert, macht 256 mögliche Werte (-128 bis 127). Überschreitet eine Rechnung diesen Bereich, gibt es KEINE Exception, sondern einen stillen Überlauf (“Wraparound”):
byte b = 127;
b++; // kein Fehler! b ist jetzt -128 (Overflow, wraps around)
byte[] rohdaten = {(byte) 0xFF, (byte) 0x00, (byte) 0x7F}; // typischer Einsatzzweck: BinärdatenDer häufigste praktische Einsatzzweck von byte ist NICHT das Speichern kleiner Zahlen im Alltagscode (dafür nimmt man aus Gewohnheit meist int), sondern der Umgang mit rohen Binärdaten — Datei-Streams (InputStream/OutputStream arbeiten byteweise), Netzwerkpakete oder Bildverarbeitung. Weil arithmetische Ausdrücke mit byte-Operanden in Java automatisch zu int “hochgestuft” werden (Integer Promotion), muss das Ergebnis explizit zurückgecastet werden, wenn man es wieder in einer byte-Variable speichern will (siehe Assignment Operators für die Sonderregel bei +=).
byte in der Praxis: Dateien einlesen
try (InputStream in = new FileInputStream("bild.png")) {
byte[] puffer = new byte[1024];
int gelesen;
while ((gelesen = in.read(puffer)) != -1) {
// gelesen = Anzahl tatsächlich gelesener Bytes (kann < 1024 sein, v.a. am Dateiende)
verarbeite(puffer, gelesen);
}
} catch (IOException e) {
System.err.println("Fehler: " + e.getMessage());
}InputStream.read(byte[]) liefert -1 zurück, sobald das Dateiende erreicht ist — analog zu readLine(), das bei Character-Streams null liefert.
Vorzeichenbehaftet — eine Java-Eigenheit
Anders als in manchen anderen Sprachen (z. B. C mit unsigned char) ist byte in Java IMMER vorzeichenbehaftet (signed), es gibt keinen unsigned-Ganzzahltyp in Java. Das führt zu einer bekannten Stolperfalle beim Verarbeiten von Binärdaten, deren einzelne Bytes eigentlich als Werte 0-255 gedacht sind: Java interpretiert einen Byte-Wert über 127 automatisch als negative Zahl. Der übliche Workaround ist eine Bitmaske:
byte roh = (byte) 0xFF; // -1 in Java, obwohl "eigentlich" 255 gemeint war
int korrekt = roh & 0xFF; // 255 - die Bitmaske entfernt das Vorzeichen-Bit korrektSpeicherersparnis bei großen Datenmengen
Bei sehr großen Arrays mit vielen Millionen kleinen Werten (z. B. Bilddaten, Sensor-Messreihen) kann sich der bewusste Einsatz von byte[] statt int[] lohnen — ein byte-Array belegt nur ein Viertel des Speichers eines gleich langen int-Arrays (1 Byte statt 4 Byte pro Element).
Siehe auch: short, long, Type Casting, I/O Streams