Tại sao InputStream#read()
trả về số int
chứ không phải byte
?Tại sao InputStream # read() trả về một int chứ không phải một byte?
Trả lời
Bởi vì một byte
chỉ có thể giữ -128 đến 127, trong khi nó phải trả lại 0 cho đến 255 (và -1 khi không có byte còn lại (tức là EOF)). Ngay cả khi trả lại byte
, sẽ không có chỗ để đại diện cho EOF.
Một câu hỏi thú vị hơn là tại sao nó không trả về short
.
Vì EOF (kết thúc tệp hoặc thường kết thúc dữ liệu) không thể được biểu diễn bằng char.
Vì vậy, nó có thể trả về "-1". Nó phải làm điều đó khi không có thêm byte để đọc.
Bạn không thể có nó trả về một byte đôi VÀ -1 cho EOF/nobyte/bất cứ điều gì, vì vậy nó trả về một int;)
Nó trả về một int vì khi luồng không thể đọc được nữa, nó trả về -1.
Nếu trả về một byte, thì -1 không thể trả lại để cho biết lỗi vì -1 là byte hợp lệ. Ngoài ra, bạn không thể trả về giá trị trên 127 hoặc dưới -128 vì Java chỉ xử lý các byte đã ký.
Nhiều lần khi một người đang đọc tệp, bạn muốn các byte chưa ký cho mã xử lý của mình. Để có được giá trị giữa 128 và 255 bạn có thể sử dụng một đoạn ngắn, nhưng bằng cách sử dụng một int, bạn sẽ căn chỉnh thanh ghi bộ nhớ với bus dữ liệu của bạn hiệu quả hơn. Kết quả là, bạn không thực sự mất bất kỳ thông tin bằng cách sử dụng một int, và bạn có thể đạt được một chút về hiệu suất. Nhược điểm duy nhất là chi phí của bộ nhớ, nhưng tỷ lệ cược là bạn sẽ không được treo trên để int đó lâu (như bạn sẽ xử lý nó và biến nó thành một char hoặc byte []).
Nó trả về một int vì khi * EOF * xuất hiện nó trả về -1. Khi một lỗi xảy ra nó ném một ngoại lệ. – EJP
làm tài liệu Java nói trong InputStream#read, Giá trị byte được trả về dưới dạng int trong phạm vi từ 0 đến 255. Tức là giá trị byte [-128 ~ 127] đã được thay đổi thành giá trị int [0 ~ 255], vì vậy giá trị trả lại có thể được sử dụng để biểu thị kết thúc luồng.
Phụ thêm để BalusC answer:
-
không
- một
byte
cho phép [0; 255] như năng lực chính và additionaly -1 như EOF dẫn int
được sử dụng để điều chỉnh kết quả đến từ máy (một trong những yêu cầu chính để I/O hoạt động - vận tốc, vì vậy họ sẽ làm việc càng nhanh càng tốt có thể!)
Ngoại lệ không được sử dụng vì chúng chậm đáng kể!
- 1. Tại sao read() trong FileInputStream trả về một số nguyên?
- 2. Tại sao dict.keys của Python() trả về một danh sách chứ không phải một bộ?
- 3. Tại sao Math.Round không trả về một int?
- 4. tại sao CountDownLatch.getCount() trả về một thời gian dài nhưng không phải là int?
- 5. Tại sao java.util.zip.CRC32.getValue() trả về một, không phải là int?
- 6. Tại sao getResourceAsStream với một chuỗi rỗng trả về một InputStream trống?
- 7. Tại sao mảng typeof với đối tượng trả về "Đối tượng" chứ không phải "Mảng"?
- 8. int() lập luận phải là một chuỗi hoặc một số, chứ không phải 'SimpleLazyObject'
- 9. DocumentBuilder.parse (InputStream) trả về null
- 10. Tại sao 'this' là một con trỏ chứ không phải là một tham chiếu?
- 11. Tại sao mã này KHÔNG trả về một NullPointerException?
- 12. Tại sao một số mảng có thể được xuất bản chứ không phải các mảng khác?
- 13. Cách giải quyết "trình vòng lặp phải trả lại chuỗi chứ không phải byte"
- 14. Tại sao FileInputStream read() không chặn?
- 15. Windows Forms Modal Dialog trả về một đối tượng chứ không phải DialogResult
- 16. Tại sao sàn không trả về một số nguyên?
- 17. Tại sao dòng Scala này trả về một Đơn vị?
- 18. Tại sao Windows.Forms trong Hệ thống chứ không phải Microsoft?
- 19. Tại sao scipy.io.wavfile.read không trả về một bộ tuple?
- 20. Tại sao sử dụng argparse chứ không phải là optparse?
- 21. Tại sao UnhandledExceptionEventArgs.ExceptionObject đối tượng chứ không phải ngoại lệ?
- 22. Tại sao toán tử gán phải trả về một tham chiếu đến đối tượng?
- 23. SFINAE hoạt động theo kiểu trả về chứ không phải là thông số mẫu
- 24. Tại sao bằng "-eq" trong PowerShell chứ không phải chỉ "="?
- 25. Tại sao DateTime.Now.Year một int và không phải là một ushort
- 26. FBConnect: Tại sao nó hiển thị trên một số trang chứ không phải trang khác?
- 27. Tại sao instance_eval lại thành công với một Proc chứ không phải với Lambda?
- 28. Tại sao một python regex sẽ biên dịch trên Linux chứ không phải Windows?
- 29. Tại sao getResourceAsStream() hoạt động trong IDE chứ không phải JAR?
- 30. Tại sao toán tử xor trên hai byte tạo ra một int?
+1 tại sao nó không trả lại một 'short'? :) – dogbane
@dogbane, @BalusC - Tôi đoán vì int nhanh hơn ngắn. Tập lệnh cho ngắn hạn là khá hạn chế, vì vậy JVM sẽ coi nó như là một int. Tham khảo: http://java.sun.com/docs/books/jvms/second_edition/html/Overview.doc.html#7565 – Ishtar
Hoặc char chưa được ký. –