Warum gibt InputStream#read()
eine int
und keine byte
zurück?Warum gibt InputStream # read() ein int und kein Byte zurück?
Antwort
Da ein byte
nur -128 bis 127 halten kann, während er zurückkehren sollte 0 bis 255 (und -1, wenn kein Byte mehr übrig ist (zB EOF)). Selbst wenn es byte
zurückgeben würde, wäre kein Platz, um EOF darzustellen.
Eine interessantere Frage ist, warum es short
nicht zurückgibt.
Da EOF (Ende der Datei oder allgemein Ende der Daten) kann nicht mit Zeichen dargestellt werden.
So kann es "-1" zurückgeben. Dies muss geschehen, wenn keine Bytes mehr zu lesen sind.
Sie können es ein Byte manchmal und -1 für EOF/nobyte nicht haben Rückkehr/was auch immer, also ist es ein int zurückgibt;)
Es gibt einen int zurück, weil der Stream, wenn er nicht mehr gelesen werden kann, -1 zurückgibt.
Wenn ein Byte zurückgegeben wurde, konnte -1 nicht zurückgegeben werden, um einen Fehler anzuzeigen, da -1 ein gültiges Byte ist. Darüber hinaus konnten Sie keinen Wert über 127 oder unter -128 zurückgeben, da Java nur signierte Bytes verarbeitet.
Viele Male, wenn man eine Datei liest, möchten Sie die vorzeichenlosen Bytes für Ihren Verarbeitungscode. Um Werte zwischen 128 und 255 zu erhalten, könnten Sie einen kurzen verwenden, aber indem Sie einen int verwenden, werden Sie die Speicherregister effizienter mit Ihrem Datenbus ausrichten. Als Ergebnis verlieren Sie keine Informationen wirklich, indem Sie einen Int verwenden, und Sie erhalten wahrscheinlich ein bisschen Leistung. Der einzige Nachteil sind die Kosten für den Speicher, aber die Wahrscheinlichkeit ist groß, dass Sie nicht lange an diesem int hängen bleiben (da Sie ihn verarbeiten und in ein char oder Byte umwandeln werden []).
Es gibt ein int zurück, denn wenn * EOF * auftritt, wird -1 zurückgegeben. Wenn ein Fehler auftritt, wird eine Ausnahme ausgelöst. – EJP
wie das Java-Dokument sagt in InputStream#read, Das Wertbyte wird als ein int im Bereich 0 bis 255 zurückgegeben. Das heißt, der Bytewert [-128 ~ 127] wurde in den int-Wert [0 ~ 255] geändert, sodass der Rückgabewert verwendet werden kann, um das Ende des Streams darzustellen.
Anfügen zu BalusC answer:
- kein
byte
[0 zu ermöglichen; 255] als Hauptkapazität und Additionaly -1 als Folge EOF int
wird verwendet, Ergebnis Maschinenwort einzustellen (eine der wichtigsten Anforderungen an den I/O-Operationen - Geschwindigkeit, so sollten sie so schnell arbeiten wie möglich!)
Ausnahme wird nicht verwendet, weil sie deutlich langsam sind!
- 1. Warum gibt read() ein Byte und keinen String aus?
- 2. WCF gibt kein int zurück
- 3. Warum gibt Dappers .Execute (...) ein int zurück?
- 4. DocumentBuilder.parse (InputStream) gibt null zurück
- 5. Warum gibt MarshalByRefObject.InitializeLifetimeService ein Objekt und kein ILease zurück?
- 6. Warum 'BitConverter.GetBytes()' akzeptiert Argument des Typs 'Byte' und gibt immer ein 2-Byte-Array zurück?
- 7. Warum gibt (int) (33.46639 * 1000000) 33466389 zurück?
- 8. Warum gibt meine Funktion "Funktion" und kein ganzzahliges Ergebnis zurück?
- 9. Warum gibt dieser Stream kein Element zurück?
- 10. Warum gibt Date.parse kein Date-Objekt zurück?
- 11. Byte [] zu InputStream oder OutputStream
- 12. Warum ist 1e400 kein int?
- 13. Warum gibt Event Intent in Android kein Ergebnis zurück?
- 14. Warum gibt C++ beim Dividieren kein Double zurück?
- 15. C# read Byte [] right-justify
- 16. InputStream und OutOfMemory Fehler
- 17. Warum gibt map ein leeres Array zurück?
- 18. Warum gibt Math.floor ein Double zurück?
- 19. Warum gibt getResourceAsStream mit einer leeren Zeichenfolge einen leeren InputStream zurück?
- 20. Wie konvertiert man byte [] nach InputStream?
- 21. Firebase Android Query gibt kein Ergebnis zurück
- 22. Warum gibt java.util.zip.CRC32.getValue() einen langen, keinen int zurück?
- 23. Casting int Byte gibt unterschiedliche Ergebnisse in Netbeans und JCreator
- 24. Wann sollte read() oder read (byte []) oder BufferedInputStream verwendet werden?
- 25. tcp: Warum gibt nur ein zweiter Aufruf von Socket.Receive (byte []) Daten zurück?
- 26. Warum gibt abs (komplex <int>) immer null zurück?
- 27. Konvertieren von Byte [] zu DateTime gibt ein falsches Jahr zurück
- 28. Warum gibt die WriteTo-Methode von io.WriterTo einen Int64-Wert und nicht einen Int-Wert zurück?
- 29. ImageIO.read (Inputstream) gibt null in BufferedImage
- 30. Warum int/int = int?
+1 warum gibt es dann kein 'short' zurück? :) – dogbane
@dogbane, @BalusC - Ich denke, weil int schneller ist als kurz. Der kurze Befehlssatz ist ziemlich begrenzt, so dass die JVM ihn trotzdem wie einen Int behandeln würde. Referenz: http://java.sun.com/docs/books/jvms/second_edition/html/Overview.doc.html#7565 – Ishtar
Oder Zeichen, das nicht signiert ist. –