Wyszukiwanie ciągu znaków w pliku za pomocą BufferedReader o określonym rozmiarze bufora.

0

Witam,

mam za zadanie wyszukać podany ciąg znaków w pliku za pomocą strumieni. Mógłbym taki plik sprawdzać linia po linii, czy w aktualnie odczytanej dany ciąg znaków występuje, ale muszę wziąć pod uwagę, że plik może zajmować 20GB i w ogóle nie posiadać znaku nowej linii, co wtedy?
Dlatego pomyślałem o przeszukiwaniu pliku za pomocą BufferedReader o określonym rozmiarze bufora, ale..

Przypuśćmy, że szukam ciągu "abcd" a mój bufor pozwala na wczytanie czterech znaków w jednym momencie. Jak się zabezpieczyć przed sytuacją gdy przeszukując plik trafię na coś takiego:
[ _ _ a b] [c d _ _ ]
litery "ab" będą na końcu ciągu wczytanego a litery "cd" będą na początku już nowo wczytanego ciągu z pliku.
Czyli w pliku występuje ciąg "abcd" ale taki sposób tego nie znajdzie.

Proszę o wskazówki jak do tego podejść, co przeczytać, na co zwrócić uwagę.

Za wszystkie propozycje, porady - wielkie dzięki.

Pozdrawiam,
Michał

0

Jednym z rozwiązań jest stworzenie sobie zmiennej w której będziesz przechowywał wartość bufora.
Możesz wczytywać po jednym znaku z bufora, do zmiennej która ma wielkość taką jak szukany ciąg.

Za każdym razem po wczytaniu porównujesz zmienna z ciągiem.
Jeżeli nie są równe, to usuwasz ze zmiennej pierwszy znak (np. kopiując do zmiennej tymczasowej) i dodajesz odczytany 1 znak z bufora.

Jeżeli pobierasz 4 znaki z bufora, to tworzysz większa zmienną 4 + wielkość taką jak szukany ciąg i zanim dodasz nowe 4 znaki z bufora usuwasz po 1 z początku zmiennej za każdym razem porównując z szukanym ciągiem (i tak 4 razy).

0

Jeśli ciąg który szukasz jest stosunkowo krótki to ja bym zrobił tak:
http://en.wikipedia.org/wiki/Knuth%E2%80%93Morris%E2%80%93Pratt_algorithm
nie robił buforowania, zmodyfikował algo minimalnie tak, żeby czytał bezpośrednio z wejścia zamiast z tablicy (chyba, że tylko po to żeby troche przyspieszyć, to wtedy ok, ale pierwsza wersja by była bez buforowania)

1 użytkowników online, w tym zalogowanych: 0, gości: 1