2012-10-21 10 views
12

ファイルを読み書きしようとしていますが、リソース経由でそのファイルにアクセスしたいと思います。リソース経由でJavaファイルを読み書きする

これは私が

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())); 

何をすべきかですが、どちらも正しいようです。これを行う正しい方法は何ですか?

答えて

19

は、以下試してみてください。

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

または出力のために

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

、以下試してください。

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

ありがとう! PrintWriterを使用した出力はどうでしょうか – CodeGuy

+0

同じ方法で動作するはずですが、同じファイルを同時に読み書きしないでください。 –

+0

私にコードを表示できますか? PrintWriterが動作しないようです。 – CodeGuy

0

もっと単純に、

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

パスはresourcesフォルダーからの相対パスであることに注意してください。

+0

このソリューションは、リソースがjarファイル内に埋め込まれている場合は動作しません。私の場合、リソースのURIは '' jar:file:/ C:/PCProxAPI/PCProxAPI.jar!/com/agilysys/rguest/buy/peripherals/PCProxPlusConfig.cfg」と 'Paths.get(...) 'throws' java.nio.file.FileSystemNotFoundException' – HairOfTheDog

+1

'Resources'クラスが実際に' com.google.common.io.Resources'であることを不思議に思う人のために – HairOfTheDog

+0

@HairOfTheDog、 "Paths"ユーティリティはファイルを "知っています"システム。ファイルがjarファイルにパッケージ化されると、もはやファイルシステムのパラダイムにはなりません。 – chaiyachaiya

1

上記のすべての解決方法は、ビルドフォルダでリソースへのアクセスを受け取る方法を示しています。これは、リソースが.classファイルを持つディレクトリを構築するために移動されたことを意味します。
あなたがそれらを後に終了するプログラムを保存するためのリソースにいくつかのファイルを記述する必要がある場合は、あなたがルートプロジェクトで始まるパスを記述する必要があります:

./src/main/resources/foo.ext

この解決策はお勧めできませんが、他の場合には必要になる場合があります。

+0

元のレースパスで狙いを定める目的のフォルダを指した後に道があるかどうか私は自分で尋ねていました。 –

関連する問題