Mam folder / pakiet zasobów w katalogu głównym mojego projektu, „nie” chcę ładować określonego pliku. Gdybym chciał załadować określony plik, użyłbym class.getResourceAsStream i byłoby dobrze !! W rzeczywistości chcę załadować „Folder” w folderze zasobów, zapętlić pliki w tym folderze i pobrać strumień do każdego pliku i wczytać zawartość ... Załóżmy, że nazwy plików nie są określane przed uruchomieniem ... Co powinienem zrobić? Czy istnieje sposób, aby uzyskać listę plików znajdujących się w folderze w pliku jar? Zauważ, że plik JAR z zasobami to ten sam plik jar, z którego jest uruchamiany kod ...
Z góry dziękuję...
Odpowiedzi:
Wreszcie znalazłem rozwiązanie:
Drugi blok działa tylko wtedy, gdy uruchomisz aplikację na IDE (nie z plikiem jar), możesz go usunąć, jeśli ci się nie podoba.
źródło
Spróbuj wykonać następujące czynności.
Utwórz ścieżkę do zasobu
"<PathRelativeToThisClassFile>/<ResourceDirectory>"
Np. Jeśli ścieżka klasy to com.abc.package.MyClass, a pliki zasobów znajdują się w src / com / abc / package / resources /:Możesz także użyć
źródło
File
klasie. Ten kod nie działa z zasobami w pliku JAR. Kropka.Wiem, że to było wiele lat temu. Ale właśnie dla innych ludzi ten temat trafia. To, co możesz zrobić, to użyć
getResourceAsStream()
metody ze ścieżką do katalogu, a strumień wejściowy będzie miał wszystkie nazwy plików z tego katalogu. Następnie możesz połączyć ścieżkę dir z każdą nazwą pliku i wywołać getResourceAsStream dla każdego pliku w pętli.źródło
Miałem ten sam problem, gdy próbowałem załadować niektóre konfiguracje hadoopów z zasobów zapakowanych w słoiku ... zarówno w IDE, jak i na jar (wersja wydana).
Zauważyłem,
java.nio.file.DirectoryStream
że najlepiej działa iteracja po zawartości katalogów zarówno w lokalnym systemie plików, jak i jar.źródło
Poniższy kod zwraca żądany „folder” jako ścieżkę, niezależnie od tego, czy znajduje się w słoiku, czy nie.
Wymaga java 7+.
źródło
folder
) wydaje się być ignorowana podczas tworzenia systemu plików. DlategogetPath
nie wracafolder/path/to/...
, ale tylkopath/to/...
.Inne rozwiązanie, możesz to zrobić za pomocą
ResourceLoader
tego:źródło
Proste ... użyj OSGi. W OSGi możesz iterować po wpisach swojego Pakietu za pomocą funkcji findEntries i findPaths.
źródło
W moim pliku jar miałem folder o nazwie Upload, ten folder zawierał trzy inne pliki tekstowe i potrzebowałem mieć dokładnie ten sam folder i pliki poza plikiem jar, użyłem poniższego kodu:
źródło
Jak wskazują inne odpowiedzi, gdy zasoby znajdą się w pliku jar, sprawy stają się naprawdę brzydkie. W naszym przypadku to rozwiązanie:
https://stackoverflow.com/a/13227570/516188
działa bardzo dobrze w testach (ponieważ po uruchomieniu testów kod nie jest spakowany w pliku jar), ale nie działa, gdy aplikacja faktycznie działa normalnie. Więc to, co zrobiłem, to ... Zakodowałem listę plików w aplikacji, ale mam test, który czyta aktualną listę z dysku (mogę to zrobić, ponieważ działa w testach) i kończy się niepowodzeniem, jeśli rzeczywista lista nie działa nie pasuje do listy zwracanej przez aplikację.
W ten sposób mam prosty kod w mojej aplikacji (bez sztuczek) i jestem pewien, że dzięki testowi nie zapomniałem dodać nowego wpisu do listy.
źródło
Ten link zawiera informacje, jak to zrobić.
Magią jest metoda getResourceAsStream ():
źródło