2013-04-16 12 views
6

Po prostu chcę odczytać plik do mojego programu. Plik znajduje się w jednym katalogu nad katalogiem roboczym na "../f.fsh". Więc następujący kod działa poprawnie, gdy uruchomię go w IDEDlaczego funkcja getResourceAsStream() działa w środowisku IDE, ale nie JAR?

String name="../f.fsh"; 
InputStream is = getClass().getResourceAsStream(name); 
InputStreamReader isreader=new InputStreamReader(is);//CRASHES HERE WITH NULL POINTER EXCEPTION 
BufferedReader br = new BufferedReader(isreader); 

ale gdy tworzę plik JAR który f.fsh spakowane w jej wnętrzu i uruchomić go, to wywala podczas tworzenia InputStreamReader, ponieważ InputStream ma wartość null.

Przeczytałem kilka odpowiedzi na pytania dotyczące strumieni wejściowych i plików JAR, a to, co otrzymałem, to to, że powinienem używać względnych ścieżek, ale już to robię. Z tego co rozumiem, getResourceAsStream() może znaleźć pliki względem katalogu głównego projektu, tego właśnie chcę. Dlaczego nie działa w JAR? Co jest nie tak, jak mogę to naprawić?

Czy ma to związek ze ścieżką klas? Myślałem, że to tylko w przypadku dołączania plików zewnętrznych do uruchamianego słoika.

Próbowałem również, ale nie, gdy oddanie ukośnik w:

InputStream is = getClass().getResourceAsStream("\\"+name); 

spojrzałem na: How to get a path to a resource in a Java JAR file andfound że zawartość słoika nie może necesarily być dostepne w postaci pliku. Tak więc spróbowałem go, kopiując plik w stosunku do słoika (jeden katalog z słoika), a to wciąż kończy się niepowodzeniem. W każdym razie chciałbym zostawić moje pliki w słoiku i móc je tam przeczytać. Nie wiem, co jest nie tak.

Odpowiedz

3

Jeśli .. działa w Class.getResourceAsStream() podczas działania z Eclipse, jest to błąd w Eclipse. Eclipse i inne IDE zaimplementują niestandardowe programy ładujące klasy w celu pobierania zasobów z projektu w czasie wykonywania. Wygląda na to, że implementacja modułu ładującego klasy w Eclipse nie wykonuje wszystkich niezbędnych weryfikacji na wejściu do metody getResourceAsStream(). W tym przypadku błąd jest na twoją korzyść, ale będziesz musiał ponownie przemyśleć, w jaki sposób strukturyzujesz zasoby, aby twój kod działał we wszystkich przypadkach.

+0

Dzięki, to ma sens. Zmieniłem lokalizację plików i miejsce, w którym znajdują się moje zasoby, i udało mi się ominąć ten błąd w słoiku. Nigdy bym nie pomyślał, że Eclipse ma błąd na moją korzyść. Dziękuję bardzo! – AAB

8

Nie można używać .. z Class.getResourceAsStream().

Aby załadować zasobu f.fsh w tym samym opakowaniu co klasa użyć SomeClass.class.getResourceAsStream("f.fsh")

Aby załadować zasobu f.fsh w foo.bar sub-pakietu z pakietu klasy użyć SomeClass.class.getResourceAsStream("foo/bar/f.fsh")

Aby obciążenia zasobów f.fsh w każdym com.company.foo.bar paczki, należy SomeClass.class.getResourceAsStream("/com/company/foo/bar/f.fsh")

to opisano w javadoc sposobu getResource(), chociaż brakuje przykładów.

+0

Dzięki za odpowiedź widzę, co mówisz o dodawaniu ukośnika lub nie na początku. Nie działa z ".."? Wydaje się nie sprawdzać "..", kiedy uruchamiam go od zaćmienia. Ale po prostu nie jest kompatybilny ze słojem? Czy wiesz, dlaczego tak jest? – AAB

+1

Jestem nawet zaskoczony, że działa, gdy jest używany ze słoika. Javadoc nie pozwala na użycie. Tak właśnie zostało zaprojektowane. –

+0

Po prostu doświadczyłem tego samego problemu. Domyślam się, że po uruchomieniu z plików klas na dysku argument jest po prostu wysyłany (nieznacznie analizowany) do funkcji systemu operacyjnego i dlatego działa pomimo braku protokołu. Zostało to przetestowane z SE6 btw. – user

Powiązane problemy