1. ホーム
  2. java

[解決済み] java.io.FileNotFoundException: 指定されたファイルが見つかりません。

2022-02-05 10:42:54

質問

私は"という名前のファイルを持っています。 word.txt となります。

と同じディレクトリにあり、私の java ファイルを作成します。

しかし、次のコードでアクセスしようとすると、このような ファイルが見つかりません というエラーが発生します。

Exception in thread "main" java.io.FileNotFoundException: word.txt 
(The system cannot find the file specified)
    at java.io.FileInputStream.open(Native Method)
    at java.io.FileInputStream.<init>(Unknown Source)
    at java.util.Scanner.<init>(Unknown Source)
    at Hangman1.main(Hangman1.java:6)

以下は私のコードです。

import java.io.File;
import java.util.*;

public class Hangman1 {
    public static void main(String[] args) throws Exception {
        Scanner input = new Scanner(new File("word.txt"));          
        String in = "";         
        in = input.nextLine();          
    }
}

解決方法は?

word.txtをプロジェクトルートフォルダの子として、srcのピアに直接置く。

Project_Root
    src
    word.txt

免責事項 この特殊なケースでなぜうまくいくのか、なぜ他の人にはうまくいかないのかを説明したいと思います。

なぜうまくいくのか

を使用する場合 File または他の FileXxx の変種を使う場合、ファイルシステム上で "作業ディレクトリ"。 . 作業ディレクトリは、このように記述することができます。

コマンドラインから実行する場合

C:\EclipseWorkspace\ProjectRoot\bin > java com.mypackage.Hangman1

作業ディレクトリは C:\EclipseWorkspace\ProjectRoot\bin . IDEでは(少なくとも私が扱ったすべてのIDEでは)、作業ディレクトリは ProjectRoot . そのため、ファイルが ProjectRoot の場合、作業ディレクトリのルートにあるため、相対パスとしてファイル名だけを使用することは有効です。

同様に、これがあなたのプロジェクトの構造であったとしたら ProjectRoot\src\word.txt の場合、パス "src/word.txt" が有効になります。

機能しない可能性がある理由

一つは、作業ディレクトリが常に変更される可能性があることです。例えば、上の例のようにコマンドラインからコードを実行すると、作業ディレクトリは bin . なので、この場合は bin\word.txt

次に、このプロジェクトをjarにエクスポートする場合、このファイルがjarに含まれるように設定されていると、パスが有効でなくなるため、これも失敗します。

ということは、そのファイルを 埋め込みリソース (または、単に "リソース" - 相互に使用する用語です). もしそうなら、そのファイルをクラスパスに構築し、URL経由でアクセスすることになります。この場合、まず最初にしなければならないことは、そのファイルが ビルド をクラスパスに追加します。プロジェクトルートにファイルがある状態で、そのファイルをインクルードするようにビルドを設定する必要があります。 しかし に置いた場合、そのファイルは src またはそれ以下のディレクトリにある場合、デフォルトのビルドでは、クラスパスにそれを置く必要があります。

クラスパス・リソースには、いくつかの方法でアクセスすることができます。例えば Class クラスがあり、これは getResourceXxx メソッドがあり、そこからクラスパスのリソースを取得することができます。

例えば、プロジェクト構造を ProjectRoot\src\resources\word.txt を使用することができます。

InputStream is = Hangman1.class.getResourceAsStream("/resources/word.txt");
BufferedReader reader = new BufferedReader(new InputStreamReader(is));

getResourceAsStream InputStream しかし、その裏側ではURLを取得しています。別の方法として URL が必要な場合は getResource() は URL を返します。

Mavenユーザーの場合、ディレクトリ構造が以下のような場合 src/main/resources の中身は resources フォルダは、クラスパスのルートに置かれます。ですから、もしそこにファイルがあるのなら、あなたはただ getResourceAsStream("/thefile.txt")