68

「 」という名前のファイルがあります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();          
    }
}
4

8 に答える 8

111

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"は有効です。

うまくいかない理由

1 つは、作業ディレクトリが常に変更される可能性があることです。たとえば、上記の例のようにコマンド ラインからコードを実行すると、作業ディレクトリは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")

于 2013-11-09T03:24:16.593 に答える
21

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

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

}

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

于 2013-11-09T03:22:30.160 に答える
3

ファイルは、他のサブフォルダー内ではなく、プロジェクト フォルダーの直下にある必要があります。

プロジェクトのフォルダに などの名前が付いている場合は、フォルダとAProject同じ場所にある必要がありsrcます。

Aproject
        src
        word.txt
于 2013-11-09T03:26:09.677 に答える
1

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

于 2016-04-12T19:22:55.327 に答える
1

コードを使用してファイルを作成してみてください。システムが作成するファイルのパスがわかります。

File test=new File("check.txt");
if (test.createNewFile()) {
    System.out.println("File created: " + test.getName());
  }
于 2020-05-17T21:57:45.513 に答える