2009-10-01 32 views
5

Tôi đang sử dụng một số ObjectInputStream để gọi readObject để đọc theo số Objects được tuần tự hóa. Tôi muốn tránh có phương pháp chặn này, vì vậy tôi đang tìm cách sử dụng một cái gì đó như Inputstream.available().Tuần tự hóa Java, ObjectInputStream.readObject(), kiểm tra xem sẽ chặn

InputStream.available() sẽ cho bạn biết có sẵn byte và read() sẽ không chặn. Có một phương pháp tương đương cho seriailzation mà sẽ cho bạn biết nếu có Object s có sẵn và readObject sẽ không chặn?

Trả lời

6

No. Mặc dù bạn có thể sử dụng ObjectInputStream trong một chuỗi khác và kiểm tra xem liệu có một đối tượng có sẵn hay không. Nói chung bỏ phiếu không phải là một ý tưởng tuyệt vời, đặc biệt là với những người nghèo bảo lãnh của InputStream.available.

4

API tuần tự hóa Java không được thiết kế để hỗ trợ chức năng available(). Nếu bạn thực hiện các chức năng đọc/ghi đối tượng của riêng mình, bạn có thể đọc bất kỳ lượng dữ liệu nào từ luồng bạn thích và không có phương pháp báo cáo.

Vì vậy, readObject() không biết số lượng dữ liệu sẽ đọc, do đó, nó không biết có bao nhiêu đối tượng.

Khi bài đăng khác được đề xuất, đặt cược tốt nhất của bạn là di chuyển việc đọc vào một chuỗi riêng biệt.

0

Tôi có một ý tưởng rằng bằng cách thêm InputStream khác vào chuỗi người ta có thể làm cho thông tin sẵn có thể đọc được bởi khách hàng:

HACK!

InputStream is = ... // where we actually read the data 
BufferedInputStream bis = new BufferedInputStream(is); 
ObjectInputStream ois = new ObjectInputStream(bis); 

if(bis.available() > N) { 
    Object o = ois.readObject(); 
} 

Điểm khó khăn là giá trị của N. Nó phải đủ lớn để bao gồm cả tiêu đề và đối tượng dữ liệu tuần tự. Nếu những thứ đó thay đổi dữ dội, không may mắn.

+1

Nếu chúng khác nhau, bạn có thể mất nhiều tiền. Nếu bạn chọn N lớn hơn đối tượng tiếp theo, thì bạn có thể rơi vào trạng thái bế tắc nơi bạn đang chờ đợi nhiều hơn đối tượng hiện tại và người gửi sẽ không gửi đối tượng tiếp theo cho đến khi bạn trả lời đối tượng trước đó . Đảm bảo tốt hơn rằng có nguồn cung cấp đầu vào bất ngờ trước khi sử dụng phương pháp này! – PanCrit

0

BufferedInputStream hoạt động cho tôi và tại sao không chỉ kiểm tra nếu (bis.available()> 0) thay vì giá trị N, điều này hoàn toàn phù hợp với tôi. Tôi nghĩ rằng các khối ObjectInputStream.readObject (= đợi cho đến khi) khi không có đầu vào nào được đọc. Vì vậy, nếu có bất kỳ đầu vào ở tất cả trong dòng aka nếu (bis.available()> 0) ObjectInputStream.readObject sẽ không chặn. Hãy nhớ rằng ObjectInputStream.readObject có thể ném một ClassNotFoundException, và đó không phải là vấn đề gì với tôi cả.

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