2008-11-07 26 views
7

Tôi đã thực hiện một số chương trình socket để truyền tải thông tin qua dây. Tôi đã gặp sự cố với DataOutputStream.writeUTF(). Nó dường như cho phép các chuỗi lên đến 64k nhưng tôi có một vài tình huống mà tôi có thể chạy qua điều này. Có bất kỳ lựa chọn thay thế tốt nào hỗ trợ chuỗi lớn hơn hay tôi cần phải cuộn của riêng mình?Viết các chuỗi lớn với DataOutputStream

Trả lời

15

Nó thực sự sử dụng hai byte để viết độ dài của chuỗi trước khi sử dụng thuật toán nén nó thành một, hai hoặc ba byte cho mỗi ký tự. (Xem tài liệu hướng dẫn về java.io.DataOutput) Nó gần với UTF-8, nhưng mặc dù được ghi nhận là như vậy, có những vấn đề tương thích. Nếu bạn không lo lắng về số lượng dữ liệu bạn sẽ viết, bạn có thể dễ dàng viết bằng cách viết chiều dài của chuỗi đầu tiên và sau đó là dữ liệu thô của chuỗi bằng phương thức getBytes.

// Write data 
String str="foo"; 
byte[] data=str.getBytes("UTF-8"); 
out.writeInt(data.length); 
out.write(data); 

// Read data 
int length=in.readInt(); 
byte[] data=new byte[length]; 
in.readFully(data); 
String str=new String(data,"UTF-8"); 
+0

Đã hy vọng có một API cho nó nhưng về cơ bản xác nhận những gì tôi đã suy nghĩ. – Glen

2

Bạn sẽ có thể sử dụng OutputStreamWriter với mã hóa UTF-8. Không có phương thức writeUTF rõ ràng, nhưng bạn có thể đặt bộ ký tự trong hàm tạo. Hãy thử

Writer osw = new OutputStreamWriter(out, "UTF-8"); 

trong đó out là bất kỳ thứ gì OutputStream bạn đang gói ngay bây giờ.

7

ObjectOutputStream.writeObject() xử lý đúng chuỗi dài (được xác minh bằng cách xem mã nguồn). Viết chuỗi ra theo cách này:

ObjectOutputStream oos = new ObjectOutputStream(out); 
... other write operations ... 
oos.writeObject(myString); 
... other write operations ... 

đọc nó theo cách này:

ObjectInputStream ois = new ObjectInputStream(in); 
... other read operations ... 
String myString = (String) ois.readObject(); 
... other read operations ... 

Một khác biệt với DataOutputStream là sử dụng ObjectOutputStream tự động viết một dòng tiêu đề 4-byte khi khởi tạo, nhưng nó thường sẽ là một hình phạt khá nhỏ để trả tiền.

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