2011-08-11 11 views
6

Tôi đang sử dụng DataOutputStream để ghi vào một tệp, tuy nhiên tôi muốn thay đổi phần cuối của dữ liệu.Trong Java, khi ghi vào một tệp với DataOutputStream, làm cách nào để xác định Endian của dữ liệu được ghi?

Đây là cách tôi đang ghi dữ liệu byte đến tập tin (nó ra tại Little endian theo mặc định)

public void generateBinObjFile(String outputFile) 
    try { 
     // Create file 

     DataOutputStream stream = new DataOutputStream(
       new FileOutputStream(outputFile)); 

     stream.writeShort(this.quantize(this.xComponents.get(index), //<-- Short is written in little Endian 
        this.min_x, this.max_x) - 32768); 

     } // catch statements here 

Có cách nào tôi có thể xác định Endian của cách dữ liệu byte được viết bằng Java ?

Trả lời

8

Bạn không thể thực hiện việc này với DataOutputStream, luôn sử dụng kết thúc lớn.

Bạn có thể sử dụng số ByteBuffer mà bạn có thể gọi order() để ảnh hưởng đến cách đọc và ghi dữ liệu.

Bạn có thể sử dụng ByteBufferhoặc để chuẩn bị một byte[] rằng bạn sẽ viết với một sau cổ điển OutputStream trên hoặc đi hoàn toàn để nio và sử dụng bất kỳ WritableByteChannel cho việc viết

+0

nó nói "không thể nhanh chóng loại 'ByteBuffer'" Tôi đang sử dụng từ khóa mới để tạo một đối tượng của nó, có cách nào khác hay chính xác hơn để tạo một thể hiện của một đối tượng không? – deztructicus

+1

@deztructius: hãy kiểm tra JavaDoc mà tôi đã liên kết đến. –

+1

Bạn có thể sử dụng 'ByteBuffer.allocateDirect (int size)' –

0

You cannot:

Viết một đoạn ngắn vào dòng đầu ra cơ bản như hai byte, byte cao đầu tiên.

Tất cả phương thức "nhiều byte" hoạt động như thế. Nếu bạn cần nó theo cách khác, bạn cần phải tự viết byte.

0

Nó xuất dữ liệu theo kiểu có thể đọc được bởi DataInputStream.

Nếu bạn phải lo lắng về tính cuối cùng, bạn không nên sử dụng Luồng dữ liệu *.

0

tất cả các câu trả lời đưa ra là đúng. Tuy nhiên, bạn có thể lấy nguồn của DataOutputStream, dán nó vào một lớp mới, và đảo ngược thứ tự các byte trong các writeShort khác nhau, writeLong vv .. (hoặc ít nhất là trong những cái bạn cần). Nó không phải là một công việc khó khăn như vậy. Rõ ràng là bạn không thể sử dụng nó để giao tiếp với một DataInputStream ở phía bên kia, nhưng tôi cho rằng bạn cần phải ghi vào một tập tin hoặc ổ cắm với một chương trình C ở phía bên kia, vì vậy bạn sẽ không cần một DataInputStream.