web-dev-qa-db-ja.com

java.io.FileNotFoundException:システムは指定されたファイルを見つけることができません

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();          
    }
}
48
name123

Word.txtをプロジェクトルートフォルダーの子およびsrcのピアとして直接配置します

Project_Root
    src
    Word.txt

免責事項:これがなぜこの特定のケースで機能するのか、なぜ他の人には機能しないのかを説明したいと思います。

それが機能する理由:

Fileまたは他のFileXxxバリアントのいずれかを使用する場合、 "working directory"に関連するファイルシステム上のファイルを探しています。作業ディレクトリは、次のように説明できます。

コマンドラインから実行するとき

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

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

同様に、これがプロジェクト構造ProjectRoot\src\Word.txtである場合、パス"src/Word.txt"は有効です。

なぜ動かないのか

たとえば、作業ディレクトリは常に変更される可能性があります。たとえば、上記の例のようにコマンドラインからコードを実行すると、作業ディレクトリはbinです。したがって、この場合はbin\Word.txtがないため失敗します

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

そうは言っても、ファイルが embedded-resource (または単に「リソース」-私が時々交換可能に使用する用語)であるかどうかを判断する必要があります。その場合、ファイルをクラスパスにビルドし、URLを介してアクセスします。 (この場合)最初に行う必要があるのは、ファイルがクラスパスにbuiltされることを確認することです。プロジェクトルートにあるファイルを使用して、ファイルを含めるようにビルドを構成する必要があります。 ただし、srcまたは以下のディレクトリにファイルを配置すると、デフォルトのビルドでクラスパスに配置されます。

さまざまな方法でクラスパスリソースにアクセスできます。 Classメソッドを持つ getResourceXxx クラスを使用して、そこからクラスパスリソースを取得できます。

たとえば、プロジェクト構造をProjectRoot\src\resources\Word.txtに変更した場合、これを使用できます。

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

getResourceAsStreamInputStreamを返しますが、内部でURLを取得します。または、必要な場合はURLを取得できます。 getResource() はURLを返します

ディレクトリ構造がsrc/main/resourcesのようなMavenユーザーの場合、resourcesフォルダーの内容はクラスパスのルートに配置されます。そのため、そこにファイルがある場合は、getResourceAsStream("/thefile.txt")のみを使用します

84
Paul Samsotha

相対パスを使用できますが、扱いにくい場合があります。最善の解決策は、ファイルの保存場所を知ることです。つまり、フォルダーを印刷します。

import Java.io.File;
import Java.util.*;

public class Hangman1 {

    public static void main(String[] args) throws Exception {
        File myFile = new File("Word.txt");
        System.out.println("Attempting to read from file in: "+myFile.getCanonicalPath());

        Scanner input = new Scanner(myFile);
        String in = "";
        in = input.nextLine();
    }

}

このコードは、探しているフォルダーを印刷する必要があります。ファイルをそこに配置すると、準備完了です。

14
acdcjunior

ファイルは、プロジェクトフォルダーの下に直接配置し、他のサブフォルダー内には配置しないでください。

プロジェクトのフォルダに名前が付けられている場合(例: AProjectsrcフォルダーと同じ場所にある必要があります。

Aproject
        src
        Word.txt
2
LotusUNSW

プロパティファイルからパスを読み取っていましたが、最後にスペースがあることは言及しませんでした。持っていないことを確認してください。

2
Neftanic

私も同じ問題を抱えていますが、その理由を知っていますか?私はファイルの末尾に.txtを入れなかったので、FileはtextFileではなかったので、次の2つのことを行う必要があります。

  1. テキストファイルをルートディレクトリに置きます(e.x HelloWorldというプロジェクトがある場合は、パッケージディレクトリのHelloWorldファイルを右クリックして、ファイルを作成します)
  2. そのファイルとして任意の名前で保存しますが、最後に.txtを付けて問題を解決したと思いますが、それを知っている他の人に書きます。ありがとう。
1
Miner Dev

Txtファイルを作成するときは、「name.txt」という名前を入力せず、「name」と入力するだけにしてください。 「name.txt」と入力すると、Eclipseには「name.txt.txt」と表示されます。これで解決しました。また、.Javaが常駐していたフォルダーではなく、1つ上のフォルダーではなく、srcフォルダーにファイルを保存します。

1
Victor