[解決済み】Eclipseで実行すると、Javaがファイルを見つけることができない
質問
ファイルから読み込んでいるはずの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が起動すると、指定された作業ディレクトリをカレント・ディレクトリとして持つようになります。
関連
-
[解決済み】HTTPステータス 405 - リクエストメソッド「POST」はサポートされていません (Spring MVC)
-
[解決済み】Java: GZIPInputStreamの作成に失敗しました。GZIP形式ではありません
-
[解決済み] JavaでArrayListではなくLinkedListを使用するのはいつですか?
-
[解決済み] ファイルの内容からJavaの文字列を作成するにはどうすればよいですか?
-
[解決済み] Eclipseが起動できない - Javaは起動したが終了コード=13を返した
-
[解決済み] build.gradle ファイルにローカルの .jar ファイルの依存関係を追加するにはどうすればよいですか?
-
[解決済み] IntelliJのインスペクションで「シンボルを解決できない」と表示されたが、コードはコンパイルされる
-
[解決済み] Mavenが実行するJUnitテストを見つけ出せない
-
[解決済み】EclipseでAPKファイルをビルドする方法は?
-
[解決済み】EclipseでインポートされたMavenプロジェクトが、デフォルトでJava 1.6ではなくJava 1.5を使用する原因は何ですか、またそうならないようにするにはどうすればいいですか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】Hibernateエラー:同じ識別子値を持つ別のオブジェクトがすでにセッションに関連付けられました。
-
[解決済み】javaで指定されたファイルが見つからない
-
[解決済み] java のクラス内のコンストラクタは、指定された型に適用できない
-
[解決済み】不正な反射的アクセスとは?
-
[解決済み】"|="の意味は何ですか?(パイプ等号演算子)
-
[解決済み】Javaクラスの "型に解決できない"
-
[解決済み】Mockitoでモックからチェックされた例外を投げる
-
[解決済み】 JAVA 変数宣言はここではできない
-
[解決済み】Eclipseで「JUnitテストが見つかりませんでした。
-
[解決済み】Ubuntu: OpenJDK 8 - パッケージを見つけることができません。