Krzysztof K.

Krzysztof K. analityk danych,
ekonomista,
programista (Java
backend, s...

Temat: problem: jaką podać ścieżkę dla wczytywanego pliku

Witam, proszę o poradę w poniższej kwestii:
Podczas uruchamiania aplikacji, która podczas startu automatycznie wczytuje potrzebne jej dane z pliku tekstowego, zauważyłem, że plik (znajdujący się w podkatalogu WEB-INF) jest odnajdywany lub nie w zależności od tego w jakim jestem katalogu kiedy uruchamiam TOMCATa.
JAK SPRAWIĆ, ŻEBY PLIK BYŁ ZAWSZE ODNALEZIONY?
Chciałem uniknąć podania ścieżki bezwzględnej, bo przecież nie wiem jaka ona będzie, gdy przeniosę aplikację na inny serwer.
Dlatego podaję ścieżkę względną pliku, ale zdaje się, że jest ona względna do katalogu z którego uruchamiam kontener serwletów. Na swoim komputerze kontroluję katalog uruchomienia, ale co będzie jak przeniosę aplikację na obcy serwer?
A może jest jakiś standard/konwencja mówiący o tym, jaki powinien być katalog roboczy dla kontenera serwletów?
Maciej Nowicki

Maciej Nowicki Java Developer

Temat: problem: jaką podać ścieżkę dla wczytywanego pliku

Można trzymać plik w WEB-INF/classes i wczytać np. tak:


protected InputStream getFileAsInputStream(String filename) throws IOException, URISyntaxException {
URL url = this.getClass().getClassLoader().getResource(filename);
if (url != null) {
File file = new File(new URI(url.toString()));
return new FileInputStream(file);
}
throw new IOException("Unable to get URL for resource "+filename);
}
Krzysztof K.

Krzysztof K. analityk danych,
ekonomista,
programista (Java
backend, s...

Temat: problem: jaką podać ścieżkę dla wczytywanego pliku

dzięki, to powinno załatwić sprawę :) przetestuję
Piotr Wierzbowski

Piotr Wierzbowski IT Architect, Asseco
Poland S.A.

Temat: problem: jaką podać ścieżkę dla wczytywanego pliku

Z tego co pamiętam to do getResource w dziwny sposób podawało się ścieżkę pliku (z / lub bez na początku dla lokalizacji względem root class loadera)
Wszelkie wynalazki związane z plikami są w Apache Commons IO http://commons.apache.org/io/api-release/org/apache/co...

konto usunięte

Temat: problem: jaką podać ścieżkę dla wczytywanego pliku

mozna tez od razu getResourceAsStream
Maciej Nowicki:
Można trzymać plik w WEB-INF/classes i wczytać np. tak:


protected InputStream getFileAsInputStream(String filename) throws IOException, URISyntaxException {
URL url = this.getClass().getClassLoader().getResource(filename);
if (url != null) {
File file = new File(new URI(url.toString()));
return new FileInputStream(file);
}
throw new IOException("Unable to get URL for resource "+filename);
}
Jarosław Szczepankiewicz

Jarosław Szczepankiewicz Lead Technical
Consultant

Temat: problem: jaką podać ścieżkę dla wczytywanego pliku

Rekomendowaną metodą dostępu do zasobów w aplikacji servletowej jest korzystanie z ServletContext.getResourceAsStream, ma szerszy zasięg niż użycie classloaderowego ładowania (WEB-INF/classes). Oprócz tego pewne jest że należy unikać korzystania z File bo nie wszystkie kontenery servletowe rozpakowują strukturę aplikacji webowej do systemu plików (o ile mnie pamięc nie myli to jetty rozpakowuje do pamięci a nie systemu plików).
Maciej Nowicki

Maciej Nowicki Java Developer

Temat: problem: jaką podać ścieżkę dla wczytywanego pliku

Macie rację - moje rozwiązanie dobrze spisuje się na produkcji, bo choć aplikacja deployowana jest na wielu serwerach, to jedynym kontenerem jaki stosujemy jest Tomcat. Działania pod innymi kontenerami nie sprawdzałem, nie ma takiej potrzeby.

Swoją drogą jakąś w tym motywację miałem, bo faktycznie lepiej użyć getResourceAsStream() - może dlatego że to aplikacja GWT i tylko powyższy sposób działał w ten sam sposób zarówno w trybie dev jak i web? Ale tylko tak sobie gdybam, bo już dawno to było i nie pamiętam :)
Krzysztof K.

Krzysztof K. analityk danych,
ekonomista,
programista (Java
backend, s...

Temat: problem: jaką podać ścieżkę dla wczytywanego pliku

Piotr Wierzbowski:
Wszelkie wynalazki związane z plikami są w Apache Commons IO http://commons.apache.org/io/api-release/org/apache/co...

To jest ciekawe, nie znałem tego i samodzielnie konstruowałem klasę do wczytywania pliku linia po linii...
wygląda na to że (prawie?) wszystko już wynaleziono
Biorąc pod uwagę wasze wypowiedzi, przerobiłem na wczytywanie streamu linia po linii, ale
jestem ciekaw czy do tego też są podobne utilsy.

konto usunięte

Temat: problem: jaką podać ścieżkę dla wczytywanego pliku

Krzysztof K.:
Piotr Wierzbowski:
Wszelkie wynalazki związane z plikami są w Apache Commons IO http://commons.apache.org/io/api-release/org/apache/co...

To jest ciekawe, nie znałem tego i samodzielnie konstruowałem klasę do wczytywania pliku linia po linii...
wygląda na to że (prawie?) wszystko już wynaleziono

Tak to wygląda w zawodzie chyba zawsze, człowiek tydzień robi wlasne Utilsy, a po kilku miesiącach używania widzi że nie ściągnął odpowiednich bibliotek :D Ja miałem coś podobnego w JSFie, Utilsy bazujące na FacesContext, póki nie zobaczyłem że stworzono zestaw bibliotek OmniFaces.

Następna dyskusja:

Problem ze struts 1.29 i ie...




Wyślij zaproszenie do