「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
バリアントのいずれかを使用する場合、 "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));
getResourceAsStream
はInputStream
を返しますが、内部でURLを取得します。または、必要な場合はURL
を取得できます。 getResource()
はURLを返します
ディレクトリ構造がsrc/main/resources
のようなMavenユーザーの場合、resources
フォルダーの内容はクラスパスのルートに配置されます。そのため、そこにファイルがある場合は、getResourceAsStream("/thefile.txt")
のみを使用します
相対パスを使用できますが、扱いにくい場合があります。最善の解決策は、ファイルの保存場所を知ることです。つまり、フォルダーを印刷します。
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();
}
}
このコードは、探しているフォルダーを印刷する必要があります。ファイルをそこに配置すると、準備完了です。
ファイルは、プロジェクトフォルダーの下に直接配置し、他のサブフォルダー内には配置しないでください。
プロジェクトのフォルダに名前が付けられている場合(例: AProject
、src
フォルダーと同じ場所にある必要があります。
Aproject
src
Word.txt
プロパティファイルからパスを読み取っていましたが、最後にスペースがあることは言及しませんでした。持っていないことを確認してください。
私も同じ問題を抱えていますが、その理由を知っていますか?私はファイルの末尾に.txtを入れなかったので、FileはtextFileではなかったので、次の2つのことを行う必要があります。
Txtファイルを作成するときは、「name.txt」という名前を入力せず、「name」と入力するだけにしてください。 「name.txt」と入力すると、Eclipseには「name.txt.txt」と表示されます。これで解決しました。また、.Javaが常駐していたフォルダーではなく、1つ上のフォルダーではなく、srcフォルダーにファイルを保存します。