Dlaczego InputStream#read()
zwraca int
, a nie byte
?Dlaczego metoda InputStream # read() zwraca wartość int, a nie bajt?
Odpowiedz
Ponieważ byte
może posiadać tylko -128 aż 127, podczas gdy powinien on powrócić 0 do 255 (i -1, gdy nie ma już bajtu (tj. EOF)). Nawet gdyby powrócił byte
, nie byłoby miejsca na reprezentację EOF.
Bardziej interesujące pytanie brzmi: dlaczego nie zwraca short
.
Ponieważ EOF (koniec pliku lub ogólnie koniec danych) nie może być reprezentowany za pomocą znaków char.
Może więc zwrócić "-1". Musi to zrobić, gdy nie ma więcej bajtów do przeczytania.
Nie można mieć to powrót bajt czasami i -1 dla EOF/nobyte/cokolwiek, więc zwraca int;)
Zwraca int, ponieważ gdy strumienia nie można już odczytać, zwraca -1.
Jeśli zwrócił bajt, to -1 nie może zostać zwrócone, aby wskazać błąd, ponieważ -1 jest poprawnym bajtem. Ponadto nie można zwrócić wartości powyżej 127 lub poniżej -128, ponieważ Java obsługuje tylko podpisane bajty.
Wiele razy, gdy czytasz plik, potrzebujesz niepodpisanych bajtów do przetworzenia kodu. Aby uzyskać wartości od 128 do 255, można użyć skrótu, ale używając int, bardziej efektywnie wyrównasz rejestry pamięci z magistralą danych. W rezultacie nie tracisz żadnych informacji za pomocą int, a prawdopodobnie osiągniesz trochę wydajności. Jedynym minusem jest koszt pamięci, ale szanse na to, że długo nie będziesz się wtrącał do tej int (jak ją przetworzysz i przekształcisz w char lub bajt []).
Zwraca int, ponieważ po wystąpieniu * EOF * zwraca wartość -1. Gdy wystąpi błąd, zgłasza wyjątek. – EJP
jako dokument napisany w języku Java w InputStream#read, Bajt wartości jest zwracany jako wartość w zakresie od 0 do 255. Oznacza to, że wartość bajtu [-128 ~ 127] została zmieniona na wartość int [0 ~ 255], więc wartość zwracana może być używana do reprezentowania końca strumienia.
Dołączanie do BalusC answer:
-
nie
byte
aby umożliwić [0; 255] jako główny pojemności i dodatkowo -1 jak EOF spowodowaćint
służy do regulacji wynik słowa maszynowego (jeden z głównych wymogów dla operacji I/O - prędkości, więc powinny one działać tak szybko, jak możliwe!)
Wyjątek nie jest używany, ponieważ są one znacznie wolne!
- 1. Dlaczego read() w FileInputStream zwraca liczbę całkowitą?
- 2. Dlaczego java.util.zip.CRC32.getValue() zwraca długi, a nie int?
- 3. Najbardziej skuteczny sposób konwersji InputStream na bajt []?
- 4. Dlaczego metoda AndroidTestCase.getContext(). GetApplicationContext() zwraca wartość null?
- 5. Jak przekonwertować bajt [] na InputStream?
- 6. Metoda get hashmap nie zwraca wartość null
- 7. dlaczego math.Ceiling (double a) nie zwraca int bezpośrednio?
- 8. Dlaczego Array.Length int, a nie uint
- 9. Czytaj bajt pliku na bajt i parsuj do int
- 10. Dlaczego Windows Forms Designer rzuca int na bajt, a następnie z powrotem na int dla FromArgb?
- 11. Metoda wątku C# zwraca wartość?
- 12. Dlaczego ten bitowy LUB zwraca wartość null na int nullable?
- 13. C# int na bajt []
- 14. Dlaczego metoda SimpleDateFormat.parse(). GetTime() zwraca niepoprawną (ujemną) wartość?
- 15. Dlaczego String.Equals zwraca wartość false?
- 16. getSystemResourceAsStream() zwraca wartość null
- 17. Dlaczego 0XAA jest niepodpisaną int, a nie int?
- 18. int a = (int) ((0,7 + 0,1) * 10). Dlaczego a = 7?
- 19. Dlaczego python max ("a", 5) zwraca wartość ciągu?
- 20. Dlaczego wartość Integer.respond_to? (: Even?) Zwraca wartość false?
- 21. Dlaczego chrome.extension.getBackgroundPage() zwraca wartość null?
- 22. Dlaczego Activity.getPackageManager() zwraca wartość null
- 23. Dlaczego "wartośćAsNumber" zwraca wartość NaN jako wartość?
- 24. Dlaczego metoda właściwości CIImage zwraca zero
- 25. Dlaczego przesyłanie/konwersja z int zwraca gwiazdkę
- 26. Kiedy metoda Microsoft.Win32.OpenFileDialog.ShowDialog() zwraca wartość null?
- 27. Czy metoda fabryka zwraca wartość NULL?
- 28. Dlaczego int * [] zanika w int **, ale nie int [] []?
- 29. Dlaczego funkcja dict.keys() w Pythonie zwraca listę, a nie zbiór?
- 30. onPreviewFrame zwraca nieprawidłowy bajt [] length
+1 dlaczego nie zwraca 'short', a następnie? :) – dogbane
@dogbane, @BalusC - Domyślam się, że int jest szybszy niż krótki. Zestaw instrukcji w skrócie jest raczej ograniczony, więc JVM i tak by to potraktowało. Odnośnik: http://java.sun.com/docs/books/jvms/second_edition/html/Overview.doc.html#7565 – Ishtar
Lub znak, który jest niepodpisany. –