2011-01-11 35 views

Trả lời

45

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.

+6

+1 tại sao nó không trả lại một 'short'? :) – dogbane

+3

@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

+2

Hoặc char chưa được ký. –

2

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.

+0

Bạn không thể sử dụng byte và -1 vì giá trị này là chính xác và có thể xuất hiện trong dữ liệu. – wesoly

+0

Nó không thể được biểu diễn bằng cách sử dụng 'byte', vì không có giá trị out-of-band có sẵn. Nó * có thể * được biểu diễn trong bất kỳ kiểu dữ liệu nào lớn hơn 8 bit. – EJP

4

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;)

15

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 []).

+2

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

1

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.

0

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ể!

Các vấn đề liên quan