Javaプロジェクトの相対パスからファイルを読み取る方法は?java.io.Fileは指定されたパスを見つけることができません


113

2つのパッケージを持つプロジェクトがあります。

  1. tkorg.idrs.core.searchengines
  2. tkorg.idrs.core.searchengines

パッケージ(2)にはテキストファイルがListStopWords.txtあり、パッケージ(1)にはクラスがありFileLoadderます。ここにコードがありますFileLoader

File file = new File("properties\\files\\ListStopWords.txt");

しかし、このエラーがあります:

The system cannot find the path specified

あなたはそれを修正するための解決策を与えることができますか?ありがとう。


12
両方のパッケージの例は同じです。あなたは意味しないproperties.filesために2
BalusC、2010年

回答:


172

すでにクラスパスにある場合は、ディスクファイルシステムからではなく、クラスパスから取得してください。で相対パスをいじらないでくださいjava.io.File。それらは、Javaコード内から完全に制御できない現在の作業ディレクトリに依存しています。

それListStopWords.txtFileLoaderクラスと同じパッケージにあると仮定して、次のようにします:

URL url = getClass().getResource("ListStopWords.txt");
File file = new File(url.getPath());

または、あなたが最終的に求めているすべてが実際InputStreamにそれである場合:

InputStream input = getClass().getResourceAsStream("ListStopWords.txt");

は必ずしもディスクファイルシステムパスを表すとは限らないnew File()ため、これはを作成するよりも確かに推奨されurlますが、仮想ファイルシステムパスを表すこともできます(これは、JARがディスクファイルシステムの一時フォルダではなくメモリに展開されるときに発生する可能性があります)。または、両方とも定義ごとにFileコンストラクターでダイジェストできないネットワークパスです。

ファイルが(パッケージ名のヒントとして)実際に、「誤った」拡張子のみを含む十分に価値のあるプロパティファイルkey=value行を含む)である場合はInputStream、をload()メソッドにすぐにフィードできます。

Properties properties = new Properties();
properties.load(getClass().getResourceAsStream("ListStopWords.txt"));

注:staticコンテキスト内からアクセスする場合は、上記の例の代わりにFileLoader.class(または何でもYourClass.class)を使用してgetClass()ください。


FileLoaderはJavaから削除されましたか?私はこれを静的コンテキスト(Java 6)から実行しようとしていますが、インポートする方法が見つからず、型に解決できないことを通知し続けます。不思議なことに、入力と同時にオートコンプリートされましたが、エラーが発生しました。
ターボ

2
ああ、それはClassLoader.classであるはずです。
ターボ

4
@turbo:FileLoaderOP独自のカスタムクラスです。これは、リソースを取得しようとしているクラスとまったく同じです。したがって、そうNameOfYourCurrentClass.class.getResourceAsStream(...)ClassLoader.class場合に失敗しますClassLoaderクラスは(のJava EE Webアプリケーションのような)複数のクラスローダの階層と「エンタープライズ」アプリケーションで発生する可能性があり、異なるクラスローダによってロードされています。
BalusC 2013年

おお、分かった。依存しているとは思いませんでした。それを片付けてくれてありがとう!
ターボ

10
ファイルが同じパッケージにない場合の提案はありますか?私のインスタンスでは、テストパッケージにあるファイルを開こうとしています。
ロビンニューハウス2014年

44

次の行は、ファイルの相対パスを指定する場合に使用できます。

File file = new File("./properties/files/ListStopWords.txt");  

3
パスの間に3つのスラッシュがある理由を知っているかもしれません。
MSNaidu 2014

エラー:>文字列リテラルの不正なエスケープ文字。
IgorGanapolsky

これをどのように変換するのInputStreamですか?
IgorGanapolsky 2016年

1
@IgorGanapolskyInputStream is = new FileInputStream("./properties/files/ListStopWords.txt");
キャメロンハドソン

42

相対パスは、Javaでを使用して機能します。オペレーター。

  • 。現在実行中のコンテキストと同じフォルダを意味します。
  • ..は、現在実行中のコンテキストの親フォルダーを意味します。

問題は、Javaが現在探しているパスをどのようにして知るのかということです。

小さな実験をする

   File directory = new File("./");
   System.out.println(directory.getAbsolutePath());

出力を確認すると、Javaが現在探しているディレクトリがわかります。そこから、単に./演算子を使用してファイルを見つけます。

たとえば、出力が

G:\ JAVA8Ws \ MyProject \ content。

あなたのファイルはMyProjectフォルダにあります

File resourceFile = new File("../myFile.txt");

お役に立てれば


この回答を何時間も検索した結果、解決策が提供されました
erdostamasa

8
InputStream in = FileLoader.class.getResourceAsStream("<relative path from this class to the file to be read>");
try {
    BufferedReader reader = new BufferedReader(new InputStreamReader(in));
    String line = null;
        while ((line = reader.readLine()) != null) {
            System.out.println(line);
        }
} catch (Exception e) {
    e.printStackTrace();
}

1
@IgorGanapolskyそのクラスの名前。.classクラスの完全な名前を指定することによってのみ、リテラルを参照できます。
Tomasz Mularczyk 2016年

FileLoaderを意図していると思います。
jamesdeath123 2016年


5

私はコメントすることができたかもしれませんが、そのための担当者は少なくなっています。サムラットの答えは私のために仕事をしました。次のコードで現在のディレクトリパスを確認することをお勧めします。

    File directory = new File("./");
    System.out.println(directory.getAbsolutePath());

私は自分のプロジェクトで直面していた問題を修正するためにそれを単に使用しました。現在のディレクトリの親ディレクトリに戻るには、必ず./を使用してください。

    ./test/conf/appProperties/keystore 

Tomcatを介してコードを実行しているため、現在のディレクトリはプロジェクトフォルダーではありません-プロジェクトのルートへの相対パスを定義するにはどうすればよいですか?現在ハードパスを使用しています: "C:\\ Users \\ user \\ Desktop \\ Repositories \\ L1_WebShop \\ dblogs.log";
Tiago Redaelli、

このQUESをチェックアウト@TiagoRedaelli:stackoverflow.com/questions/12843217/...
dezible

4

BalusCが提供する回答はこの場合に機能しますが、URL内にスペースが含まれていると、URLが有効なファイル名ではない%20に変換されるため、エラーが発生します。文字列ではなくURIを使用してFileオブジェクトを構築すると、空白は正しく処理されます。

URL url = getClass().getResource("ListStopWords.txt");
File file = new File(url.toURI());

2

src / main // js / Simulator.java内の「command.json」を解析したかったのです。そのために、srcフォルダーにjsonファイルをコピーし、次のような絶対パスを指定しました。

Object obj  = parser.parse(new FileReader("./src/command.json"));

2

ここに画像の説明を入力してください

クラスのresourcesディレクトリから読み取りたいと仮定しますFileSystem

String file = "dummy.txt";
var path = Paths.get("src/com/company/fs/resources/", file);
System.out.println(path);

System.out.println(Files.readString(path));

注:リーディング.は必要ありません。


1

私にとって実際の問題は、Fileオブジェクトのクラスパスがからのもの<project folder path> or ./srcであるため、使用しFile file = new File("./src/xxx.txt");て問題を解決しました


0

文字列basePath = new File( "myFile.txt")。getAbsolutePath(); ファイルの正しいパスとして使用できるこのベースパス


-1

getClass()静的メソッドまたは静的ブロックから呼び出す場合は、次の方法を実行できます。

あなたは呼び出すことができますgetClass()Propertiesあなたがにロードされているオブジェクト。

public static Properties pathProperties = null;

static { 
    pathProperties = new Properties();
    String pathPropertiesFile = "/file.xml;
    InputStream paths = pathProperties.getClass().getResourceAsStream(pathPropertiesFile);
}

最後の引用が欠けている。
jamesdeath123 2016年

-1

テキストファイルが読み取られない場合は、次のように、より近い絶対パスを使用してみてください(完全な絶対パスを使用したい場合)。

FileInputStream fin=new FileInputStream("\\Dash\\src\\RS\\Test.txt");

絶対パスが次のとおりであると想定します。

C:\\Folder1\\Folder2\\Dash\\src\\RS\\Test.txt
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.