FileInputStream fstream = new FileInputStream("abc.txt")
jarとして実行中にFileNotFoundExceptionnをスローしています。どうして ?通常、mainメソッドから実行中に見つけることができます。
class MyClass{
InputStream fstream = this.getClass().getResourceAsStream("abc.txt");
}
このコードを使用する必要があります。また、ファイル(この場合はabc.txt)は、オブジェクト参照クラスの場所に保持する必要があります。手段は、this.getClassは、いくつかのフォルダすなわち、COM/myfolderなど/ MyClass.Javaフォルダの場所を指します。
したがって、abc.txtをcom/myfolderのこの場所に保持する必要があります。
ファイルが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() によるファイルのロード
FileInputStream
を使用できるのは、実際にコンピューターのファイルシステムにファイルがある場合のみです。プログラムのjarファイルにテキストファイルをパッケージ化する場合、それはファイルシステム内のファイルではありません。これは、jarファイル内のエントリです。
幸いなことに、Javaでは、この方法でファイルにアクセスする方がさらに簡単です。ファイルはクラスパスにあるため、 getResourceAsStream()
を使用できます。
InputStream stream = getClass().getResourceAsStream("abc.txt");
クラスパスが正しく設定されている場合、これは、ディレクトリ内のファイル(開発中など)であるか、jarファイル内のエントリ(リリース時など)であるかに関係なく機能します。
おそらく最もエレガントではありませんが、これが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)
}
}
これは、2つの環境で作業ディレクトリが異なる可能性があるためです。行を追加してみてください
System.out.println(new File("abc.txt").getAbsolutePath());
実際にファイルを探している場所を確認します。