1. ホーム
  2. java

[解決済み】Eclipseで実行すると、Javaがファイルを見つけることができない

2022-02-23 23:28:09

質問

ファイルから読み込んでいるはずのJavaアプリケーションをEclipseで実行すると java.io.FileNotFoundException ファイルは正しいディレクトリにあるにもかかわらず、です。 コマンドラインからアプリケーションをコンパイルして実行するのは問題ありません。この問題は、複数のプロジェクトとアプリケーションを持つEclipseでのみ発生します。 ファイルを正しく見つけるために、実行設定やビルドパスの設定を変更する必要があるのでしょうか?

解決方法を教えてください。

この問題は、あなたのアプリケーションが相対パス名を使用している可能性が高いです。 BalusC が言うように、相対パス名には問題がある可能性があります。 しかし、彼は次のように言っているのは行き過ぎではないでしょうか。 を使用する必要があります。 決して java.io 系で相対パスを使用する。 .

アプリケーションが(例えば)ファイルを開くときに FileInputStream(File) の javadoc で以下のように説明されているように、相対パス名は "current directory" から相対的に解決されます。 File.getAbsolutePath() .

[...] そうでなければ、このパス名はシステム依存の方法で解決されます。UNIXシステムでは、相対パス名は現在のユーザーディレクトリに対して解決されることによって、絶対的なものになります。Microsoft Windowsシステムでは、相対パス名は、パス名で指定されたドライブのカレントディレクトリがある場合はそれに対して解決され、ない場合はカレントユーザディレクトリに対して解決されることによって絶対化されます。

このように、WindowsとUNIXでは、カレントディレクトリの概念が異なることがわかります。 2つ目の問題は、純粋なJavaでは、カレント・ディレクトリが何であるかを決定的に見つけることができず、純粋なJavaを使用して現在のJVMのためにそれを変更することもできない、ということです。 (JVMが起動するとき、"user.dir"システム・プロパティは、カレント・ディレクトリに設定されていますが アプリケーションがこのプロパティを変更することを妨げるものは何もありません。 ので、完全に信頼することはできません。 さらに、"user.dir" を変更すると、空のパスの解決方法が変わるだけで、相対パス一般が変わるわけではありません)。

では、どうすればいいのでしょうか?

  • ファイルの参照に絶対パス名を使用するのも一つの方法です。 これは (ほとんど) すべての場合において信頼できますが、ユーザーがパス名を入力しなければならない場合、あるいは、絶対パス名を使用すると問題が生じる可能性があります。 ハードワイヤード(または設定された)絶対パス名を避ける必要がある場合。

  • もうひとつの方法は、クラスパス相対パス名を使用し、アプリケーションのインストール・ディレクトリから相対的にファイルを配置することです。 これは必要なことであれば有効ですが、アプリケーションのインストール先ディレクトリに File をライブラリのメソッドに渡すことができます。 また、ユーザーのアプリケーション・プリファレンスを探そうとする場合にも役に立ちません。 (一般的に、ユーザー設定をインストールディレクトリに置くのは間違いです...)

  • 3つ目の方法は、どこかから得た絶対的なディレクトリに対して相対的なファイル名を付けることです; 例えば new File(System.getProperty("home.dir"), "foo/bar"); .

  • 最後のオプションは、相対パス名を使用し、ユーザーがカレント・ディレクトリを把握していると仮定することです。 ユーザーがコマンドラインから実行する多くのアプリケーションでは、これが正しい解決策です。

Eclipseの場合は特に、簡単な解決策があります。 アプリケーションの起動に使用しているquot;run configuration"で、quot;Arguments"タブを開き、quot;Other"のラジオボタンをクリックしてください。 次に、起動したアプリケーションの作業ディレクトリとして、絶対パス名を入力します。 子JVMが起動すると、指定された作業ディレクトリをカレント・ディレクトリとして持つようになります。