2013-06-14 45 views
5

Tôi đang sử dụng Java để viết một mảng byte vào một tệp. Khi tôi mở tập tin của tôi trong một trình soạn thảo hex tôi không phải lúc nào cũng nhìn thấy các byte mà tôi mong đợi ở đó. Đây là mã ví dụ của tôi, nội dung của tập tin đầu ra:Viết mảng byte vào tập tin. Không phải lúc nào cũng nhận được kết quả mong đợi

public static void main(String[] args) 
{ 
    File file = new File("c:\\temp\\file.txt"); 
    file.delete(); 
    FileOutputStream outStream = null; 
    try 
    { 
     file.createNewFile(); 
    } catch (IOException e) 
    { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } 
    try 
    { 
     outStream = new FileOutputStream(file); 
    } catch (FileNotFoundException e) 
    { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } 
    try 
    { 
    outStream.write(new byte[] { 0x14, 0x00, 0x1F, 0x50 }); 

    } catch (IOException e) 
    { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } 
} 

Khi tôi mở tập tin trong một trình soạn thảo hex tôi nhận được 00 9e f3 04 như các nội dung thay vì các byte mà tôi gửi. Kết quả của tôi dường như không nhất quán. Đôi khi tôi nhận được kết quả mong đợi và đôi khi tôi thì không.


chí này ra các dữ liệu chính xác:

outStream.write(new byte[] { 0x14 , 0x00, 0x1F, 0x50, (byte) 0xE0, 0x4F, (byte) 0xD0, 0x20, (byte) 0xEA, 0x3A, 0x69, 0x10, (byte) 0xA2 , (byte) 0xD8, 0x08, 0x00, 0x2B });

nội dung tập tin bao gồm:

14 00 1f 50 e0 4f d0 20 ea 3a 69 10 a2 d8 08 00 2b 

Nếu tôi thêm một byte hơn cho mảng mà sau đó nó không thành công.

outStream.write(new byte[] { 0x14 , 0x00, 0x1F, 0x50, (byte) 0xE0, 0x4F, (byte) 0xD0, 0x20, (byte) 0xEA, 0x3A, 0x69, 0x10, (byte) 0xA2 , (byte) 0xD8, 0x08, 0x00, 0x2B, 0x30 });

nội dung tập tin tại là:

14 e5 80 9f e4 bf a0 e2 83 90 e3 ab aa e1 81 a9 ed a2 a2 08 e3 80 ab 

Tôi cũng đã gặp rắc rối với cái này:

outStream.write(new byte[] { 0x4C, 0x00, 0x00, 0x00 }); 

nội dung tập tin bao gồm:

4c 00 

Hai byte cuối cùng không được viết.


outStream.write(new byte[] { 0x4C, 0x00, 0x00, 0x00, 0x01 }); 

này sẽ tạo ra kết quả mong đợi. Nội dung tệp là:

4c 00 00 00 01 

Tôi cảm thấy mình thiếu một số thông tin cơ bản về cách dữ liệu được ghi vào tệp. Làm thế nào có thể nhận được kết quả phù hợp khi viết mảng byte vào một tập tin?

+3

Mặc dù tôi không tin rằng nó sẽ tạo sự khác biệt ở đây, hãy thử '.flush()' rồi '.đóng()' sau khi bạn '.write()' ... – fge

+1

Đó là * rất * lạ. Và đó là mã chính xác bạn thực hiện? Không có 'Writer' ở đâu? Hoặc 'Chuỗi' giá trị? Ngoài ra: lệnh gọi 'createNewFile()' không cần thiết. –

Trả lời

1

Tôi đã biên dịch chính xác mã của bạn và trong tệp đầu ra tôi nhận được những gì được mong đợi. Tôi nghĩ rằng nó là khá có thể là notepad của bạn (hoặc bất kỳ chương trình khác mà bạn đang sử dụng để kiểm tra các tập tin) không hiển thị cho bạn một số byte bạn viết (Ví dụ, textedit trên Mac của tôi từ chối hiển thị một danh sách các byte có thể) . Nếu đây chính xác là phương pháp bạn đang sử dụng, tôi đoán đó là một số thứ khác (như notepad) thất bại thay vì mã của bạn. Như bạn đã đề cập, đôi khi bạn nhận được ấn tượng rằng một số byte không được viết gì cả. Có thể thử phương pháp song sinh public void write(byte[] b, int off, int len) có thể đảm bảo bạn đã nhập bao nhiêu byte.

+0

Đây là vấn đề. Tôi đã sử dụng plugin trình chỉnh sửa hex cho notepad ++ để đọc tệp. Tôi đã tải xuống trình chỉnh sửa hex HxD và bây giờ nội dung tệp được đọc như mong đợi. – esgeroth

0

Tôi đã kiểm tra mã của bạn và mã không bị lỗi đối với tôi. Bạn có đang chuyển tệp của mình giữa các máy chủ không? Vì nó là một tệp .txt, bạn có thể nhận được một số chuyển đổi văn bản tự động đang diễn ra, bạn đã thử mà không có phần mở rộng?

Ngoài ra, hãy đảm bảo đóng tài nguyên khi hoàn tất.