2013-09-22 25 views
5

Tôi đang sử dụng một RandomAccessFile trong Java 6 nhưng có một số hành vi lạ khi đọc byte.IndexOutofBounds khi sử dụng byte đọc của Java

Với đoạn mã sau, nơi offsetdata được khởi động một cách thích hợp:

int offset; 
byte data[]; 
randFile.readFully(data, offset, data.length); 

tôi nhận được stack trace sau:

null 
java.lang.IndexOutOfBoundsException 
    at java.io.RandomAccessFile.readBytes(Native Method) 
    at java.io.RandomAccessFile.read(RandomAccessFile.java:355) 
    at java.io.RandomAccessFile.readFully(RandomAccessFile.java:414) 

NHƯNG, với cùng một giá trị của offsetdata, các sau (dường như giống hệt nhau) mã hoạt động tốt!

randFile.seek(offset); 

for (int i = 0; i < (data.length); i += 1) { 
    data[i] = randFile.readByte(); 
} 

Có ai có thông tin chi tiết về lý do này không?

+1

Giá trị nào có 'bù trừ'? – ssantos

Trả lời

6

Chỉ cần đoán, nhưng bạn có thể có offset lớn hơn 0; nếu bạn đang đọc data.length bytes bắt đầu từ một vị trí lớn hơn 0, bạn sẽ vượt qua phần cuối của mảng data, có thể đang ném IndexOutOfBoundsException.

Vì vậy, nếu bạn muốn đọc toàn bộ mảng, biến số offset sẽ được đặt thành 0. Ngoài ra, nếu bạn không muốn bắt đầu từ 0, bạn nên đọc data.length - offset bytes.-

randFile.readFully(data, offset, data.length - offset); 
+0

Tôi nghĩ bạn đã đúng. Tôi hiểu lầm các tham số bù đắp như là một bù đắp của con trỏ tập tin. Nhưng tài liệu nói rằng dữ liệu được đọc từ con trỏ tập tin hiện tại. – jaynp

+0

Nếu đó là vấn đề cuối cùng, xin vui lòng, xem xét upvoting/chấp nhận câu trả lời, nó có thể hữu ích cho những người dùng khác. – ssantos

+0

Có cùng một vấn đề chính xác ở đây! Hoàn toàn hiểu sai tài liệu và nghĩ rằng bù đắp là trong tệp. – wayway

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