2010-04-19 18 views
11

Próbuję odczytać zawartości pliku, np:zlokalizowaniu pliku w ścieżce klas

public void myMethod(){ 
    FileInputStream fstream = new FileInputStream(fileLocation); 
    BufferedReader br = new BufferedReader(new InputStreamReader(fstream)); 
    String strLine; 
    while ((strLine = br.readLine()) != null) { 
.... 
.... 
..... 
end while 
end method 

I mam na początku ciele klasy private String fileLocation; i na koniec klasy Mam getter i seter dla niego. Teraz próbuję wstrzyknąć lokalizację tego pliku z wiosennego komponentu bean wewnątrz tej klasy i podam metodę init tej klasy. Ale dostaję błąd nie może znaleźć określonego pliku tak, jakby nie był on na ścieżce klasy, ale jest w pliku wojennym? Buduję projekt z Maven i umieścić plik w src/main/resources Jest to błąd pojawia się podczas próby odczytu pliku:

Error: src\main\resources\ids.txt (The system cannot find the path specified)

to jest, gdy próbowałem to:

FileInputStream fstream = new FileInputStream("src\\main\\resources\\ids.txt"); 

jak odwołać właściwie ze ścieżki klasy?

EDIT

Kiedy edytować kod według rozwiązania @BalusC, oto jak to wygląda, ale ja wciąż null błąd:

ClassLoader classLoader = Thread.currentThread().getContextClassLoader(); 
    InputStream input = classLoader.getResourceAsStream("src/main/resources/ids.txt"); 
    BufferedReader br = new BufferedReader(new InputStreamReader(input)); 
    String strLine; 
while ((strLine = br.readLine()) != null) { 
    .... 
    .... 
    ..... 
    end while 
    end method 

Odpowiedz

22

Java IO API opiera się na lokalnym dysku system plików, a nie w ścieżce klas. Poza tym używanie względnych ścieżek w Java IO stuff jest receptą na problemy z przenośnością, nie polegaj na tym. Aby przydzielić zasoby w ścieżce klas, zwykle używałbyś ClassLoader#getResource() lub ClassLoader#getResourceAsStream().

ClassLoader classLoader = Thread.currentThread().getContextClassLoader(); 
InputStream input = classLoader.getResourceAsStream("src/main/resources/ids.txt"); 

Powiedziawszy, nie potrzebujesz tej linii DataInputStream. W rzeczywistości nie czerpiesz z tego żadnej korzyści.

Aktualizacja: jeśli to nie zadziała, to albo nazwa zasobu jest po prostu nieważny lub plik jest faktycznie nie istnieje w ścieżce klasy, gdzie można oczekiwać, że będzie. Moje centy na tym folderze src są w rzeczywistości katalogiem katalogu ścieżki klas, a nie częścią pakietu. Usuń go z nazwy.

Aktualizacja 2: aby wszystkie ścieżki systemu plików dysku głównego, które są objęte ścieżce klasy środowiska wykonawczego zrobić:

for (URL root : Collections.list(Thread.currentThread().getContextClassLoader().getResources(""))) { 
    System.out.println(root); 
} 

Nazwa zasobu musi być w stosunku do żadnego z nich. To, że zostało umieszczone w /WEB-INF/classes podczas kompilacji jest normalne. Jest on objęty ścieżką klas. Twój problem leży gdzieś indziej. Czy jesteś pewien, że nazwa zasobu jest poprawna? Czy na pewno używasz kodu, który Twoim zdaniem działa?

+0

@BalusC dziękuję za odpowiedź Zaktualizowałem moje pytanie –

+0

Już zaktualizowałem swoją odpowiedź, aby to odzwierciedlić :) – BalusC

+1

@BalusC to samo, otrzymuję null, gdy usuwam bit 'src', właśnie patrzyłem na cel wojny który jest rozmieszczony na jboss wewnątrz tego pliku znajduje się wewnątrz 'WEB-INF/classes', ale w moim projekcie w eclipse znajduje się on w' src/main/resources' jakikolwiek inny trik w twoim rękawie? –

Powiązane problemy