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
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");
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ờ.
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.
- 1. Viết file lớn với Node.js
- 2. Hiệu suất của DataInputStream \ DataOutputStream
- 3. Cách viết các tập tin (lớn) với Ruby Eventmachine
- 4. Viết tập tin lớn
- 5. Viết các tệp lớn bằng BufferedOutputStream
- 6. Ổ cắm Java: DataOutputStream hoặc OutputStream?
- 7. Viết một chuỗi (với các dòng mới) bằng Python
- 8. Mapping chuỗi lớn với thành thạo NHibernate
- 9. C#: Tìm kiếm chuỗi lớn các chuỗi khác
- 10. Xcode 4.4 đang treo khi viết chuỗi nhật ký lớn vào bàn điều khiển
- 11. Làm thế nào để viết một chuỗi inline lớn trong F #
- 12. chèn chuỗi trong tệp lớn
- 13. tách một chuỗi lớn thành các mục SET
- 14. Viết hoa một chuỗi
- 15. Redis là chậm để có được các chuỗi lớn
- 16. Viết một hàm với loại 'a -> chuỗi
- 17. C Chuỗi Chữ "quá lớn đối với ký tự"
- 18. Xử lý các danh sách Chuỗi lớn trong java
- 19. Vô hiệu hóa các chuỗi lớn ở Delphi 2010
- 20. Làm cách nào để viết chuỗi UNION với ActiveRelation?
- 21. Gửi số lượng lớn dữ liệu giữa các chuỗi Qt
- 22. Thực hiện JavaScript SHA1 cho chuỗi lớn
- 23. Viết html trong một chuỗi
- 24. Nối chuỗi chậm trên đầu vào lớn
- 25. Tìm các chuỗi trùng lặp trong một tệp lớn
- 26. Xử lý các hằng số chuỗi lớn trong Java
- 27. WM_COPYDATA SendMessage - Nó có thể gửi các chuỗi lớn không?
- 28. StringBuilder hết lỗi bộ nhớ khi làm việc với các chuỗi lớn trong java
- 29. Nén chuỗi lớn trong ruby
- 30. Cung cấp các tệp lớn với PHP
Đã 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