2012-04-09 13 views
1

私はファイルから読み込むクラスを1つ含んでいるlarge-ishプロジェクトを持っています(私は以下のSSCCEで囲んでいます)。すべてが必要なように機能します。しかし、Apple Jar BundlerまたはEclipseの「Mac OS Xアプリケーションへのエクスポート」コマンド(these instructionsに従う)を使用すると機能しません。java.io.FileNotFoundExceptionが表示されます。ファイルにアクセスする.jarにAppleのJar Bundlerを使用する

私はなぜこれを取得しようとしていますFileNotFoundExceptionと私はそれを防ぐことができます。私の推測では、Eclipseは独自のクラスローダーなどを使用しており、クラスローダーはエクスポートされたjarで正しく呼び出されていないと言い、したがってappです。

SSCCEは、次のコードは、Eclipseから実行したときに動作しますが、ないから.appjava -jar、あるいはbinディレクトリから実行java readfromfile.ReadFromFileから。 ReadFromFile.java

package readfromfile; 

import java.io.BufferedReader; 
import java.io.FileNotFoundException; 
import java.io.FileReader; 
import java.io.IOException; 

import javax.swing.BoxLayout; 
import javax.swing.JFrame; 
import javax.swing.JLabel; 

public class ReadFromFile { 
    public static void main(String[] args) { 
     String filepath = "src/readfromfile/file.txt"; 
     try { 
      BufferedReader br = new BufferedReader(new FileReader(filepath)); 
      JFrame frame = new JFrame(); 
      frame.getContentPane().setLayout(
        new BoxLayout(frame.getContentPane(), BoxLayout.Y_AXIS)); 
      for (String line; (line = br.readLine()) != null;) { 
       frame.getContentPane().add(new JLabel(line)); 
      } 
      frame.pack(); 
      frame.setVisible(true); 
     } catch (FileNotFoundException e) { 
      System.err.println("File not found"); 
      e.printStackTrace(); 
     } catch (IOException e) { 
      System.err.println("IOexception"); 
      e.printStackTrace(); 
     } 
    } 
} 

file.txtをで:

I am text 
+1

* "ファイルにアクセスするa.jar" *リソースが含まれていますか?*** Jar?もしそうなら、それにアクセスするために 'File'を使うことはできません。代わりに' URL'を使います。 –

+0

BTW - リソースが読み込み**および書き込み**のために必要な場合、[Javaプログラムが.jar内のファイルを読み書き用に使用するには?](http://stackoverflow.com/a/5052359/418556)を参照してください。 ) –

+0

@AndrewThompson:はい、それは '.jar'の中にあります。いいえ、何も書いていません。 – wchargin

答えて

3

あなたは瓶のバンドルを作成すると、多分src/...パスが存在しません。

あなたがパッケージリソースとしてファイルを入れて、あなたがそれを読んでいないのはなぜ

Reader r = new InputStreamReader(ReadFromFile.class.getResourceAsStream("file.txt")); 
BufferedReader br = new BufferedReader(r); 

当然のことながら、あなたのクラスの同じパッケージ内のファイル「file.txtは」を配置する必要があります。

+1

* "packages resources" *私は一般的に、それを '組み込みアプリケーションリソース'と呼びます。 (私は傾向を始めようとしています;)*当然のことながら、ファイル "file.txt"をあなたのクラスの同じパッケージに入れなければなりません。 "*私は一般に、フルパスクラスパスのルートから 'この場合、 '" /readfromfile/file.txt "'の行に沿っている可能性があります。 +1は、このリソースが 'File'としてアクセス可能でないかもしれないことを認識します。 –

+2

@AndrewThompsonあなたは正しいですが、私はあなたのコメントに投票しますが、まずは簡単な解決策を提案したいと思います! – dash1e

+0

'file.txt'は' ReadFromFile.java'と同じディレクトリにありますか?それはあなたの「あなたのクラスの同じパッケージ」の意味ですか? – wchargin

関連する問題