2012-04-08 35 views
9

This hiển thị trang cho biết rằng phương thức này có thể trả về -1 khi nó muốn cho biết rằng không còn byte nào để đọc.Tại sao read() trong FileInputStream trả về một số nguyên?

Nhưng một byte có phạm vi từ -128 đến 127, phải không? Và nó sẽ không có ý nghĩa hơn cho kiểu trả về của read() là byte vì nó trả về một byte?

Cảm ơn bạn đã dành thời gian.

Trả lời

3

Lý do trả lại giá trị là int là cần trả lại giá trị từ 0-255, cũng như có thể cho biết khi không có thêm byte để đọc từ tệp. Bằng cách sử dụng một số int, bạn có thể trả lại đầy đủ các giá trị không dấu 0-255 tích cực, cũng như cho biết khi nào tệp hoàn tất. Nó sẽ không thể cung cấp điều này chỉ với 256 giá trị khác biệt của một giá trị byte, một nửa trong số đó là âm theo mặc định Java.

1

Một byte dữ liệu là một giá trị unsigned với một loạt 0-255, trong khi một byte trong java được xác định nằm trong khoảng từ -128 để 127, mà không có ý nghĩa khi đọc dữ liệu nhị phân. read() trả về một số nguyên để cho phép nó sử dụng tất cả các giá trị không âm để biểu thị dữ liệu hợp lệ và giá trị âm để kết thúc dữ liệu.

Nói chung, một hàm sẽ cho biết tình trạng lỗi hoặc ngoại lệ sử dụng cơ chế khác nhau từ cơ chế mà nó sử dụng để trả về dữ liệu. Trong trường hợp đơn giản nhất, nó có thể trả về một giá trị không thể được sử dụng để biểu diễn dữ liệu hợp lệ, để đảm bảo ý nghĩa của nó là rõ ràng.

3

Chắc chắn, nhưng JavaDocs đi vào để nói ..

Returns:
tổng số byte đọc vào bộ đệm, hoặc -1 nếu không có nhiều dữ liệu hơn vì đã kết thúc tệp.

Hy vọng có thể đọc hơn 127 byte từ một luồng tại một thời điểm.

+1

Tôi cũng mắc lỗi này lần đầu tiên - phương thức read() thực sự trả về một byte dữ liệu, không phải số byte có thể đọc được. http://docs.oracle.com/javase/7/docs/api/java/io/FileInputStream.html#read%28%29 – wattostudios

+0

@Andrew Thompson Tôi nghĩ bạn đã đọc tài liệu của phương pháp sai. Bạn đọc một cho ** public int read (byte [] b) ** trong đó như tôi đang đề cập đến ** public int read() ** – GrowinMan

+0

Có một số phương thức 'read()' khác nhau. Một trả về một byte đơn; những người khác điền vào một mảng và trả về _number_ của các byte đã được đọc. –

1

Q: nó sẽ không có ý nghĩa hơn đối với kiểu trả về của đọc() là byte?

A: Không, bởi vì "byte" không thể trả về toàn bộ dải ô 0..255 (chưa ký) và "ngắn" chỉ là PITA.

+0

Ok. Tôi đã suy nghĩ có thể bằng cách sử dụng các thao tác mức bit bên trong dữ liệu có thể được lưu trữ trong chính định dạng đã ký. Đó là câm nhưng, tôi thấy bây giờ. Dù sao, tôi tò mò muốn biết tại sao ngắn là một PITA? – GrowinMan

+1

PITA == "Pain In The gluteus mAximus";) – paulsm4

+0

Chỉ vì số trong Java mặc định là giá trị 'int', vì vậy nếu nó là' short', bạn sẽ cần chuyển đổi từ 'short' sang' int', ngay cả khi các chuyển đổi được xử lý tự động bởi công cụ Java – wattostudios

0

Lớp FileInputStream giúp bạn có thể đọc nội dung của tệp dưới dạng luồng byte. Dưới đây là ví dụ đơn giản:

InputStream input = new FileInputStream("c:\\data\\input-text.txt"); 

int data = input.read(); 
while(data != -1) { 
    //do something with data... 
    doSomethingWithData(data); 

    data = input.read(); 
} 
input.close(); 

Lưu ý: Xử lý ngoại lệ thích hợp đã bị bỏ qua ở đây để rõ ràng. Để tìm hiểu thêm về xử lý ngoại lệ chính xác, hãy chuyển tới Xử lý ngoại lệ Java IO.

Phương thức read() của một FileInputStream trả về một int chứa giá trị byte của byte được đọc. Nếu phương thức read() trả về -1, không còn dữ liệu nào để đọc trong luồng và nó có thể được đóng lại. Tức là -1 là giá trị int, không phải là giá trị byte. Có một sự khác biệt ở đây!

+0

-1 vì "Đó là, -1 là giá trị int, không phải là giá trị byte. Có một sự khác biệt ở đây!". Đánh giá của '((byte) -1) == ((int) -1)' là gì? Đó là 'true' của khóa học vì byte là từ -128 đến 127 có nghĩa là -1 cũng là giá trị byte hợp pháp. –

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