2011-05-20 20 views
10

Tôi vừa tìm thấy không có phương thức readUnsignedInt() trong lớp RandomAccessFile. Tại sao? Có cách giải quyết nào để đọc một tập tin không được đăng trong tập tin?Tại sao không có readUnsignedInt trong lớp RandomAccessFile?

Edit:

Tôi muốn đọc một int unsigned từ tập tin và đặt nó vào một không gian dài.

Edit2:

có thể không sử dụng readLong(). nó sẽ đọc 8 byte không phải 4 byte. dữ liệu trong tệp có int không dấu trong phạm vi 4 byte.

Edit3:

Tìm thấy câu trả lời ở đây: http://www.petefreitag.com/item/183.cfm

Edit4:

thế nào về nếu các tập tin dữ liệu rất ít về cuối nhỏ? chúng ta cần bit trao đổi trước?

+3

Java không hỗ trợ số nguyên không dấu. http://stackoverflow.com/questions/430346/why-doesnt-java-support-unsigned-ints – Swati

+1

@Swati: Vâng, họ có thể đã thực hiện nó giống như với 'readUnsignedShort()' đọc 2 byte và trả về một int : Đọc 4 byte và trả về một khoảng thời gian dài. – musiKk

+0

Họ cũng có thể vừa triển khai int chưa được ký, nhưng bạn có thể làm gì. – Swati

Trả lời

19

tôi muốn làm như sau:

long l = file.readInt() & 0xFFFFFFFFL; 

Thao tác bit là cần thiết vì upcast sẽ mở rộng dấu âm.


Liên quan đến độ bền. Theo hiểu biết tốt nhất của tôi, tất cả I/O trong Java được thực hiện theo kiểu thời trang lớn. Tất nhiên, thường thì không quan trọng (mảng byte, mã hóa UTF-8, vv không bị ảnh hưởng bởi tính cuối) nhưng nhiều phương thức của DataInput là. Nếu số điện thoại của bạn được lưu trữ ở mức độ nhỏ, bạn phải tự chuyển đổi nó. Cơ sở duy nhất trong Java chuẩn mà tôi biết là cho phép cấu hình endianness là ByteBuffer thông qua phương thức order() nhưng sau đó bạn mở cổng tới NIO và tôi không có nhiều kinh nghiệm về điều đó.

+1

+1 đề xuất tốt! – aioobe

+1

Vâng, đó là giải pháp tốt hơn :) –

+0

Vui lòng lưu ý rằng nếu không có "L" ở cuối của 0xFFFFFFFF giải pháp này sẽ không hoạt động, mà không có L nếu số của bạn là âm, dài của bạn cũng sẽ âm –

2

Vì không có loại int không dấu trong java? Tại sao không phải là readLong()? Bạn có thể đọcLong và sau đó lấy 32 bit đầu tiên.

Sửa Bạn có thể thử

long value = Long.parseLong(Integer.toHexString(file.readInt()), 16); 
+0

* Vì không có loại int không dấu trong java? * Vâng, thực sự là một 'readUnsignedByte' ... – aioobe

+0

Và sau đó sử dụng' seek() 'để đi 4 byte trở lại vì' readLong() 'tiêu thụ quá nhiều byte? – musiKk

+0

@aioobe, vâng, xin lỗi, không nhận thấy những phương pháp này. –

3

Edited để loại bỏ readLong():

Bạn có thể sử dụng readFully(byte[] b, int off, int len) và sau đó chuyển sang Long với các phương pháp ở đây: How to convert a byte array to its numeric value (Java)?

+1

Điều đó sẽ ăn quá nhiều byte, phải không? – aioobe

+0

Điều này sẽ không giúp ích nếu số trong tệp dài 4 byte. 'readLong()' đọc 8 byte. – musiKk

+0

Đúng, bạn có thể sử dụng 'readFully()' và sau đó chuyển đổi. –

0

Tùy thuộc vào những gì bạn đang làm với int, bạn có thể không cần phải biến nó thành một thời gian dài. Bạn chỉ cần biết về các hoạt động bạn đang thực hiện. Sau khi tất cả chỉ 32-bit của nó và bạn có thể xử lý nó như là ký hoặc unsigned như bạn muốn.

Nếu bạn muốn chơi với ByteOrder, điều đơn giản nhất để làm có thể là sử dụng ByteBuffer cho phép bạn đặt một thứ tự byte. Nếu tệp của bạn nhỏ hơn 2 GB, bạn có thể ánh xạ toàn bộ tệp vào bộ nhớ và truy cập ngẫu nhiên ByteBuffer.

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