2016-09-05 2 views
1

私はJavaプログラムの短いドキュメントを書いています。メニューをクリックするとHelp-> Documentation OSのデフォルトのPDFリーダーがdocumentation.pdfを開くはずです。srcディレクトリからファイルを開きます(Java)

src/docDesktop.getDesktop().open(new File("doc/documentation.pdf"));にあるController.javaのPDFを開こうとしています。

ただし、Javaではファイルが見つかりません。 primaryStage.getIcons().add(new Image("icon/icon_512x512.png"));でプログラムのアイコンを開くと、それは完全にMain.javaで動作します。

私のIntelliJプロジェクトのレイアウトを見ることができます。

src 
├── META-INF 
├── de 
│   └── myapp 
│    ├── model 
│  │ └── *.java 
│    ├── view 
│  │ └── *.java 
│  ├── Main.java 
│    └── Controller.java 
├── doc 
│ └── documentation.pdf 
└── icon 
    └── icon_512x512.png 

マイスタック

  • IntelliJの2016.2
  • のJava 1.8.0_77
+0

docディレクトリの部分はクラスパスですか? – Jens

答えて

1

それはnew Image("icon/icon_512x512.png")で動作しますので、内部的にはコンテキストClassLoaderからのもので、これは相対パスの場合にユーザーの作業ディレクトリから取得するnew File("doc/documentation.pdf")のケースではないため、同じロジックを単純に適用できます。クラスパスから

ClassLoader contextClassLoader = Thread.currentThread().getContextClassLoader(); 
URL resource = contextClassLoader.getResource("doc/documentation.pdf"); 
Desktop.getDesktop().open(new File(resource.toURI())); 
1

3 - サードパーティアプリケーションが場合に、アプリケーション内のsrcディレクトリにアクセスすることはできません、あなたのアプリjarアーカイブでアセンブルするファイルをsrcとは別に置いてください。

もちろん、JavaのAPIであるため、Javaのアイコンを見つける。あなたは、次のメソッドを介してsrcフォルダ内のすべてのリソースにアクセスすることができ :

URL url = getClass().getResource("/path/in/src"); 
InputStream is = getClass().getResourceAsStream("/path/in/src"); 

アプリケーションがJARに組み立てされていない場合 - 次のようにファイルへのフルパスを提供してみてください:

URL url = getClass().getResource("/path/in/src"); 
    File file = new File(url.toURI()); 
1

ファイルがClassLoadergetResourceAsStreamメソッドを使用してロードすることができます。 だから、

InputStream is = Controller.class.getClassLoader().getResourceAsStream("doc/documentation.pdf"); 

入力ストリームオブジェクトを生成して試すことができますし、入力ストリームを生成した後は、Javaプログラムでそれを読むことができます。

関連する問題