web-dev-qa-db-ja.com

jarとして実行中のFileNotFoundException

FileInputStream fstream = new FileInputStream("abc.txt")

jarとして実行中にFileNotFoundExceptionnをスローしています。どうして ?通常、mainメソッドから実行中に見つけることができます。

7
Subhajit
class MyClass{

    InputStream fstream = this.getClass().getResourceAsStream("abc.txt");

}

このコードを使用する必要があります。また、ファイル(この場合はabc.txt)は、オブジェクト参照クラスの場所に保持する必要があります。手段は、this.getClassは、いくつかのフォルダすなわち、COM/myfolderなど/ MyClass.Javaフォルダの場所を指します。

したがって、abc.txtをcom/myfolderのこの場​​所に保持する必要があります。

2
Subhajit

ファイルがjarにパッケージ化されている場合は、getClass().getResource(url)を使用して情報を取得する必要があります。

FileInputStream inputStream = 
new FileInputStream(new File(getClass().getResource(/path/to/your/file/abc.txt).toURI()));

それ以外の場合は、常にjarと同じパスで作成する必要があり、同じように取得できます。

src/myJar.jar
src/folder/abc.txt

FileInputStream fstream = new FileInputStream("folder/abc.txt");

ここでも読むことができます:

リソースフォルダからファイルをロードするにはどうすればよいですか? および getClass()。getResource() によるファイルのロード

2
YCF_L

FileInputStreamを使用できるのは、実際にコンピューターのファイルシステムにファイルがある場合のみです。プログラムのjarファイルにテキストファイルをパッケージ化する場合、それはファイルシステム内のファイルではありません。これは、jarファイル内のエントリです。

幸いなことに、Javaでは、この方法でファイルにアクセスする方がさらに簡単です。ファイルはクラスパスにあるため、 getResourceAsStream() を使用できます。

InputStream stream = getClass().getResourceAsStream("abc.txt");

クラスパスが正しく設定されている場合、これは、ディレクトリ内のファイル(開発中など)であるか、jarファイル内のエントリ(リリース時など)であるかに関係なく機能します。

1
dsh

おそらく最もエレガントではありませんが、これがScalaのすべてのオプションをカバーする方法です。

def loadFile(path: String) = {
    val f = new File(path)
    if (f.exists) {
      loadFileFromPath(path)
    } else {
      val r = Try {
        val in = ClassLoader.getSystemResourceAsStream(path)
        new InputStreamReader(in)
      }.getOrElse{
        val in = getClass.getResourceAsStream(s"/$path")
        new InputStreamReader(in)
      }
      loadFileFromInputStream(r)
    }
  }
0
Atais

これは、2つの環境で作業ディレクトリが異なる可能性があるためです。行を追加してみてください

System.out.println(new File("abc.txt").getAbsolutePath());

実際にファイルを探している場所を確認します。

0
Steve Smith