Java i listing wszystkich plików w katalogu

directoryW ostatnim czasie musiałem przerobić jeden z systemów na wersję wielojęzykową. Chodziło dokładnie o to, aby wszystkie Stringi zostały wywołane przez tzw. wrapper ze wstrzyknięciem pewnego kontekstu (Locale, kategoria grupująca, czy parametry).

Np. jeśli w kodzie był fragment:

to został przerobiony na coś takiego:

lub coś takiego:

Typowy przykład Buildera z przeciążoną metodą toString() wykonującą translację. Taki wrapper wykonuje wyszukanie tekstu już zapisanego w systemie (czy to w bazie, czy w plikach), a jeśli nie istnieje – dopisuje go. W ten sposób zostają zdefiniowane szablony tekstów w ustalonym źródłowym języku i w celu dodania nowej wersji językowej, należy przypisać do każdego z nich odpowiednie tłumaczenie. System zaś z kontekstu użytkownika wybierze odpowiednie Locale i przypisze odpowiednią wersję.

Ale w zasadzie nie kwestię samych tłumaczeń chciałem tu poruszyć, a to co wymagało żmudnej pracy po finalnej refaktoryzacji kodu. Należało wyszukać wszystkie szablony i zapisać je. Problem w tym, że zmodyfikowanych plików źródłowych .java było mnóstwo, w różnych podkatalogach. Ze względu na to, że konieczne było wyciąganie dodatkowych zmiennych javy w źródłach (patrz zmienna category), postanowiłem zrobić proste narzędzie napisane również w javie wyszukujące wszystkie pliki z rozszerzeniem .java, a z nich wszystkie wywołania metody I18n.begin.

Java 6, 7, 8

Poniżej krótki przegląd możliwości listowania plików w podkatalogach. Załóżmy, że należy zaimplementować funkcję walk(String rootPath), której celem będzie obsłużenie wszystkich plików (aby nie zaciemniać kodu pomijam filtry na rozszerzenia plików).

W miejscach zakomentowanych //TODO należy jeszcze zaimplementować obsługę przetwarzania konkretnego pliku.

Tworzymy interfejsy

  1. Interfejs do przetwarzania pliku.
  2. Abstrakcyjna klasa do implementacji listingu plików

    W konstruktorze przekazujemy implementację interfejsu obsługującego przetwarzanie konkretnego pliku, który wykorzystywany będzie w klasach dziedziczących (w metodzie walk).
  3. Implementacja klasy do przetwarzania pliku – proste wyświetlenie ścieżki pliku do wyjście

    W tym miejscu można utworzyć dowolne klasy przetwarzające dany plik (np. odczyt i wyszukiwanie tekstów, skopiowanie w inne miejsce, itp.).
  4. Tworzymy 3 implementacje dla różnych wersji Javy


  5. Uruchamiamy przetwarzanie danych

Jak widzicie, dzięki wykonaniu tych prostych interfejsów nasz kod jest w miarę zamknięty na modyfikacje i otwarty na rozszerzenia (open/closed principle). Możemy napisać gotową implementację interfejsu FileVisitable np. do wyszukiwania wybranych fragmentów tekstu i czynność tą separujemy od implementacji wyszukiwania plików. Oczywiście na tym nie koniec, np. do klasy AbstractFileVisitor możemy dodać obsługę kolejnego interfejsu odpowiedzialnego za filtrowanie plików.

Wynik

W Windowsie na dysku C utworzyłem katalog Files zawierący podkatalogi jak na poniższym obrazku, a w każdym z nich utworzyłem pusty plik o nazwie file.txt.

filesDirectory

Wynik działania kodu z punktu 5 wygląda następująco:

Trzy dobre książki do nauki Javy

Do niedzieli 10 kwietnia dostępny jest kod rabatowy na 45 złotych w Helionie o czym piszę w aktualnościach promocyjnych.

To również może Cię zainteresować:

  • Czat z socket.io i JavaCzat z socket.io i Java Cel: Oprogramowanie w javie chatu działającego w czasie rzeczywistym bez komunikacji asynchronicznej. Biblioteki: socket.io netty-socketio Efekt […]
  • Mapowanie XML obiektów Java – JAXBMapowanie XML obiektów Java – JAXB Podczas tworzenia oprogramowania na każdym kroku mamy kontakt z danymi w formacie XML. Opiszę tutaj jeden ze sposobów konwersji danych w obie strony Java <-> XML. Ale na […]
  • Fundamenty języka JavaFundamenty języka Java Niecały miesiąc temu zostałem poproszony przez Strefę Kursów o ocenę ich nowo wydanego materiału dla osób chcących zacząć naukę programowania w Javie: "Fundamenty języka Java". Przerobiłem […]
  • Java JNA #2, Total CommanderJava JNA #2, Total Commander W poprzednim wpisie zrobiłem krótkie wprowadzenie do wykorzystywania biblioteki user32.dll przez Javę do pobierania informacji z innych aplikacji okienkowych. Poniżej rozszerzymy nasze […]
  • Permutacje, cz. 2 – algorytmyPermutacje, cz. 2 – algorytmy W poprzednim wpisie programistyczne rozwiązanie zagadki polegało na wygenerowaniu wszystkich permutacji zbioru i sprawdzeniu każdej z nich pod względem spełnienia warunku […]
  • Arduino – zdalne sterowanie oświetleniemArduino – zdalne sterowanie oświetleniem W tym artykule opiszę sposób wykonania zdalnego sterowania jednym urządzeniem wpinanym do gniazdka 230V z wykorzystaniem Arduino. Wykorzystane będzie połączenie przez USB z komputerem, […]

Dodaj komentarz

Twój adres email nie zostanie opublikowany. Pola, których wypełnienie jest wymagane, są oznaczone symbolem *