Tôi đang học cách sử dụng InputStream. Tôi đã cố gắng sử dụng nhãn hiệu cho BufferedInputStream, nhưng khi tôi cố gắng để thiết lập lại tôi có những trường hợp ngoại lệ:Đánh dấu luồng đầu vào được đánh dấu là giới hạn đọc
java.io.IOException: Resetting to invalid mark
Tôi nghĩ rằng điều này có nghĩa rằng dấu ấn của tôi đọc giới hạn được thiết lập sai. Tôi thực sự không biết cách thiết lập giới hạn đọc trong mark(). Tôi đã thử cách này:
is = new BufferedInputStream(is);
is.mark(is.available());
Điều này cũng sai.
is.mark(16);
Điều này cũng có cùng ngoại lệ. Tôi làm cách nào để biết giới hạn đọc được đặt là gì? Vì tôi sẽ đọc các kích thước tệp khác nhau từ luồng đầu vào.
Việc cá nhân của tôi? Đừng dùng dấu - trong khi tôi chắc chắn có một cái, tôi vẫn chưa tìm được lý do chính đáng cho nó. Thông thường, đó là một dấu hiệu của việc xử lý kém ở nơi đầu tiên. Tôi có xu hướng nghĩ về một luồng không phải là luồng trừ khi tôi đang xử lý hình thức thô nhất mà nó có. Tôi muốn có một wrapper chặt chẽ xung quanh nó được thông tin của nó, gói nó lên, và gửi gói đó để xử lý một nơi nào đó trong ứng dụng. – corsiKa
@glowcoder Cảm ơn nhận xét của bạn. Như tôi đã nói trước đó, tôi mới làm việc với InputStream. Tôi đã thực sự cố gắng sử dụng luồng đầu vào hai lần. Tôi nghĩ rằng đây là cách để làm điều đó. Đặt dấu và đặt lại. Bạn có gợi ý nào khác về cách đạt được điều này không? –
Đánh dấu hoạt động như thế này. Giả sử luồng đầu vào của bạn sẽ kết thúc là 'A B C D E'. Bạn xử lý 'A B' cho đến nay. (Hãy nhớ rằng, bạn không biết những gì 'hạ lưu' được nêu ra.) Bạn đánh dấu nó. Sau đó bạn đọc thêm một số, và bạn nhận được 'C D E'. Bạn nhìn vào nó và nói "Đợi đã, tôi không thể xử lý' C D E' trong chế độ này! " vì lý do gì. Vì vậy, bạn nói "Tôi thực sự muốn tôi có thể quay trở lại để xử lý' C D E' một lần nữa ... mà bạn có thể, vì bạn 'mark()' ed nó.Bạn chỉ cần 'reset()' để đưa luồng trở lại vị trí của nó khi bạn đánh dấu nó và bạn có thể đọc lại nó như bạn đã có trước đây. – corsiKa