2016-12-22 30 views
0

私はJavaを初めて使いFXアプリケーションを構築しようとしています。私の関数の1つは、特定の文字列を他の文字列に置き換えることを目的としていますターゲットファイルの絶対パスを定義している限り、スクリプトは正常に動作しますが、相対パスで作業するとブレークします。Java Paths.get .... readAllBytes(path))が相対パスで動作しない

"readAllBytes"メソッドには問題があります。このメソッドは完全なパスでのみ動作します。しかし、フォルダの場所が変わるため、相対パスが必要です。

対象ファイルはプロジェクトフォルダにあります。絶対パスを必要としない、ファイルコンテンツを読み取るために使用できる他の方法はありますか?

ありがとうございます。ファイルが指定した場所に存在しないことを意味していjava.nio.file.NoSuchFileException: Target.fxml

if (checkbox.isSelected()) { 
     //this works ..... 
     Path path = Paths.get("//home/../../../../Target.fxml") 
     Charset charset = StandardCharsets.UTF_8; 
     String content = new String(Files.readAllBytes(path)); 
     content = content.replaceAll("text_old" , "text_new"); 
     Files.write(path, content.getBytes(charset)); 

     //this doesn't work... 
     Path path = Paths.get("Target.fxml"); 


Caused by: java.nio.file.NoSuchFileException: Target.fxml 
+0

あなたが行っていることを知るために十分なコードを投稿できますか? 「コンテンツ」とは何ですか?そして、完全なスタックトレースを質問に投稿してください。 –

+2

タイトルは、 "相対パスで動作していない" *とし、まず、相対パスで動作する*ヒント:* '" Target.fxml "'は相対パスです。したがって、現在のディレクトリでファイルを見つけることができます。次に、それは絶対パスで動作すると言います。次に、ClassLoader.getResource()で動作しないと言います。ファイルはクラスパス上にあるはずですか?クラスパス上の現在のディレクトリですか? – Andreas

+0

皆さん、ご援助いただき、ありがとうございます。上記のアップデートをご覧ください。 – rainer

答えて

1

例外根本的な原因:以下は抜粋です。

Paths.get("Target.fxml")を実行している場合は、ファイルTarget.fxmlの現在の作業ディレクトリが表示されます。しかし、ファイルがsrc/javafxapplication/Target.fxmlにあり、プログラムが別のディレクトリから実行されているため、Target.fxmlが見つかりません。

あなたは、例えばを使用してアプリケーションの作業ディレクトリを確認することができます。:

System.out.println(System.getProperty("user.dir"))); 

これは非常によくclassesディレクトリかもしれません。たとえば、 classesから次のパスを使用することができますsrcフォルダへのポイント:

Paths.get("../src/javafxapplication/Target.fxml") 

srcフォルダは、通常、配布パッケージの一部ではないので、これはしかし、悪い習慣です。Target.fxmlを別の場所にコピーするか、Apache Mavenのようなビルドツールを使用してTarget.fxmlを含むjarファイルを作成し、ClassLoader.getResource()を使用してjarファイルから内容を読み込んでください。

+0

Fasseg、3つのドットはクエリのパス名を短縮するだけで、スクリプトの一部ではありません。完全なパスは/home/rainer/NetBeansProjects/JavaFXApplication/src/javafxapplication/Target.fxmlです。 – rainer

+0

さて、わかりました。実際には 'Paths.get("/home/rainer/NetBeansProjects/JavaFXApplication/src/javafxap plication/Target.fxm l ")'を試していますか? – fasseg

+0

''新しいjava.io.File( "/ home/rainer/NetBeansProjects/JavaFXApplication/src/javafxap plication/Target.fxm l")は存在しますか? – fasseg

1

結局のところ、Fassegなど、時間と忍耐を見つけてくれたことに感謝しています。最終的なコードは次のとおりです。

 Path path = Paths.get("src/javafxapplication2/PopupFXML.fxml"); 
     Charset charset = StandardCharsets.UTF_8; 
     String content = new String(Files.readAllBytes(path)); 
     content = content.replaceAll("old_text" , "new_text"); 
     Files.write(path, content.getBytes(charset)); 
関連する問題