Przetwarzam strumień binarny i muszę przejść skutecznie poza zakres danych, które nie są mi potrzebne, do niektórych danych, które będą przetwarzane.Trwałe pomijanie danych w java.io.InputStream i jego podtypach
InputStream.skip(long)
nie robi dużo w drodze gwarancji:
pomija i odrzutów n bajtów danych z tego strumienia wejściowego. Metoda przeskakiwania może z wielu powodów przeskoczyć o mniejszą liczbę bajtów, być może 0. Może to wynikać z dowolnego z szeregu warunków; docieranie do końca pliku przed pomijaniem n bajtów jest tylko jedną z możliwości. Zwracana jest rzeczywista liczba pominiętych bajtów.
muszę wiedzieć, że jedna z dwóch rzeczy się wydarzyło:
- Strumień zakończony
- Bajty zostały pominięte
dość proste. Jednakże, złagodzenie przyznane w tym opisie oznacza, że na przykład BufferedInputStream
może po prostu pominąć kilka bajtów i powrócić. Jasne, mówi mi, że pomijano tylko tych kilka, ale nie jest jasne, dlaczego.
Moje pytanie brzmi: czy można użyć InputStream.skip(long)
w taki sposób, aby wiedzieć, kiedy kończy się strumień lub czy pomijanie kończy się pomyślnie?
Twoja odpowiedź konkretnie wyjaśnia, co mnie martwi. Kod, który opublikowałem _seems_ do pracy w praktyce, ale nie mam pewności, że zadziałałby dla wszystkich implementacji 'InputStream'. Twoje rozszerzenie wygląda interesująco, a wypróbuję je wkrótce w [klasie, w której jest to potrzebne] (https://code.google.com/p/metadata-extractor/source/browse/Source/com/drew/lang/ StreamReader.java). Obecnie mój interfejs API próbuje zgłosić, czy pominięcie powiodło się, więc może być konieczna modyfikacja kodu klienta, jeśli żadna gwarancja nie jest możliwa. Dziękuję bardzo. –
Możesz naprawić problem 'FileInputStream.skip()': używaj pętli 'while' dla' n-1' bajtów; następnie, po pętli, wywołaj 'in.read()' raz. Jeśli zwróci "-1", Twój skok będzie trafiony EOF, w przeciwnym razie pomyłka zakończyła się powodzeniem. Nie zapomnij również o sprawdzeniu "n == 0" u góry. –
@KannanGoundan Interesująca sugestia. Wadą jest oczywiście to, że wymagałoby co najmniej dwóch odczytów ze strumienia (jeden "przeskok" i jeden "odczyt"), co w niektórych sytuacjach może wpłynąć na wydajność. – leonbloy