2010-09-16 14 views
11

Potrzebuję przeczytać plik w moim kodzie. To fizycznie znajduje się tutaj:Jak odwołać się do zasobu w Javie?

C:\eclipseWorkspace\ProjectA\src\com\company\somePackage\MyFile.txt 

Mam umieścić go w pakiecie źródłowym tak, że gdy tworzę runnable pliku jar (Export-> Runnable pliku JAR) pobiera zawarte w słoiku. Pierwotnie miałem go w katalogu głównym projektu (a także wypróbowałem normalny podkatalog), ale eksport nie zawierał go w słoiku.

Jeśli w moim kodu zrobić:

File myFile = new File("com\\company\\somePackage\\MyFile.txt"); 

plik jar poprawnie lokalizuje plik, ale działa lokalnie (Run As> Jawa Główna aplikacja) wyrzuca plik nie znaleziono wyjątek, ponieważ spodziewa się :

File myFile = new File("src\\com\\company\\somePackage\\MyFile.txt"); 

Ale to nie powiedzie się w moim pliku jar. Moje pytanie brzmi: w jaki sposób mogę sprawić, aby ta koncepcja działała zarówno w przypadku uruchamiania lokalnie, jak i w moim pliku JAR?

Odpowiedz

33

Użyj ClassLoader.getResourceAsStream lub Class.getResourceAsStream. Główna różnica między nimi polega na tym, że wersja ClassLoader zawsze używa ścieżki "absolutnej" (w pliku jar lub czymkolwiek innym), podczas gdy wersja Class jest względna w stosunku do samej klasy, chyba że przedrostkiem jest ścieżka /.

Więc jeśli masz klasę com.company.somePackage.SomeClass i com.company.other.AnyClass (w obrębie tego samego classloader jako zasobu) można użyć:

SomeClass.class.getResourceAsStream("MyFile.txt") 

lub

AnyClass.class.getClassLoader() 
       .getResourceAsStream("com/company/somePackage/MyFile.txt"); 

lub

AnyClass.class.getResourceAsStream("/com/company/somePackage/MyFile.txt"); 
0

If Umieściłem plik w pliku jar, działało tylko wtedy i tylko wtedy, gdy użyłem

...getResourceAsStream("com/company/somePackage/MyFile.txt") 

Jeśli użyłem obiektu File, to nigdy nie zadziałało. Dostałem również wyjątek FileNotFound. Teraz pozostaję z obiektem InputStream.

Powiązane problemy