2012-10-21 9 views
12

Próbuję odczytać i zapisać w pliku, ale chcę uzyskać dostęp do tego pliku za pośrednictwem zasobu.Odczyt i zapis do pliku Java za pomocą zasobu

To co robię

File f = new File(ClassLoader.getSystemResource("/blah/blah/Properties.prop").toURI()); 
BufferedReader br = new BufferedReader(new FileReader(f)); 
String line = br.readLine(); 

PrintWriter p = new PrintWriter(new File(ClassLoader.getSystemResource("/blah/blah/Properties.prop").toURI())); 

ale nie wydaje się prawidłowe. Jaki jest prawidłowy sposób to zrobić?

Odpowiedz

19

Spróbuj poniżej:

 InputStreamReader isReader= 
         new InputStreamReader(
          this.getClass().getResourceAsStream(templateName)); 
     BufferedReader br = new BufferedReader(isReader);  

lub

 InputStreamReader isReader= 
         new InputStreamReader(
          <youclassName>.class.getResourceAsStream(templateName)); 
     BufferedReader br = new BufferedReader(isReader); 

Dla wyjścia, spróbuj poniżej:

 PrintWriter writer = 
       new PrintWriter(
        new File(this.getClass().getResource(templateName).getPath()); 
+0

dzięki! co z danymi wyjściowymi przy użyciu PrintWriter – CodeGuy

+0

Powinny działać w ten sam sposób, ale nie należy jednocześnie czytać i zapisywać tego samego pliku. –

+0

możesz pokazać mi kod. Nie mogę sprawić, że PrintWriter działa – CodeGuy

0

prościej

try (BufferedReader bufferedReader = Files.newBufferedReader(Paths.get(Resources.getResource("path").toURI()))) { 
     //bufferedReader... 
    } 
    try (BufferedWriter bufferedWriter = Files.newBufferedWriter(Paths.get(Resources.getResource("path").toURI()))) { 
     //bufferedWriter... 
    } 

Należy zauważyć, że ścieżka jest względna do folderu zasobów.

+0

To rozwiązanie nie działa, gdy zasób jest osadzony w pliku jar. W moim przypadku identyfikator URI zasobu jest oceniany jako "jar: file:/C: /PCProxAPI/PCProxAPI.jar! /com/agilysys/rguest/buy/peripherals/PCProxPlusConfig.cfg" 'i' Paths.get (...) 'throws' java.nio.file.FileSystemNotFoundException' – HairOfTheDog

+1

Dla każdego, kto zastanawia się, że klasa 'Resources' jest w rzeczywistości' com.google.common.io.Resources' – HairOfTheDog

+0

@HairOfTheDog, narzędzie "Ścieżki" tylko "zna" plik system. Gdy plik jest spakowany w słoiku, nie jest już paradygmatem systemu plików. – chaiyachaiya

1

Wszystkie powyższe rozwiązania pokazują, w jaki sposób można uzyskać dostęp do zasobów w folderze build. Oznacza to, że zasoby zostały przeniesione do katalogu z plikami .class.
Jeśli trzeba napisać jakieś pliki do zasobów na zapisywanie ich po zakończony program, a następnie trzeba będzie opisać drogę zaczynając od projektu root:

./src/main/resources/foo.ext

To rozwiązanie nie jest zalecane, ale może być konieczne w innych przypadkach.

+0

Pytałem sam, czy jest jakiś sposób, po wskazaniu folderu docelowego, aby zmienić jego oryginalną ścieżkę. –

Powiązane problemy