1

Linux でスペースを含むパスを使用しようとすると、明らかに FileNotFoundException が発生します。しかし、回避策としてパスに二重/一重引用符を追加しようとすると、同じ例外が発生します。

原因を調べてみると、引用符を使用したときに生成される絶対パスが、user.homeシステム プロパティ + 指定パスになることがわかりました。

例えば:

このパスを使用する場合:

/home/db2inst1/Desktop/testing - Development Environmet/64_dev/testing/logs

これは、引用符を使用しようとしたときに取得する絶対パスです。

/home/db2inst1/"/home/db2inst1/Desktop/testing - Development Environmet/64_dev/testing/logs"

また、引用符を追加する代わりにスペースを「\」に置き換えようとしましたが、うまくいきませんでした。

私は多くのAPIを試しましたが、毎回発生します。テスト用にこのコードを作成しました:

System.out.println("- regular path: ");
System.out.println(new File(path).getPath());
System.out.println(new File(path).getAbsolutePath());               
System.out.println("- quoted path: ");
System.out.println(new File(quotedPath).getPath());
System.out.println(new File(quotedPath).getAbsolutePath());

そして、これは出力です:

- regular path: 
/home/db2inst1/Desktop/testing - Development Environmet/64_dev/testing/logs/testing.log
/home/db2inst1/Desktop/testing - Development Environmet/64_dev/testing/logs/testing.log
- absolute path: 
"/home/db2inst1/Desktop/testing - Development Environmet/64_dev/testing/logs/testing.log"
/home/db2inst1/"/home/db2inst1/Desktop/testing - Development Environmet/64_dev/testing/logs/testing.log"

なぜこれが起こっているのか、それを機能させる方法を知っている人はいますか?

4

2 に答える 2

1

あなたの説明から、File(java.lang.String pathname)コンストラクターを呼び出しているようです。

その場合、Stringパスを表すために使用される は引用符を使用しないでください。

ドキュメントで説明されているように、引用符は抽象パス名の定義では特殊文字とは見なされませんjava.io.File

抽象パス名には 2 つのコンポーネントがあります。

  1. オプションのシステム依存のプレフィックス文字列 (ディスク ドライブ指定子、UNIX >ルート ディレクトリの「/」、Microsoft Windows UNC パス名の「\\」など)、および
  2. 0 個以上の文字列名のシーケンス。

引用符は特殊文字ではないため、名前の一部と見なされます。

例:

public static void main(String[] args) {
    File quotes = new File("\"C:\\myFolder\"");
    File noQuotes = new File("C:\\myFolder");

    System.out.println("Absolute path with quotes:" + quotes.getAbsolutePath());
    System.out.println("Absolute path without quotes:" + noQuotes.getAbsolutePath());
    System.out.println("Equal: " + quotes.equals(noQuotes));

    File empty = new File("");
    File emptyQuotes = new File("\"\"");

    System.out.println("Empty path with quotes:" + empty.getAbsolutePath());
    System.out.println("Empty path without quotes:"
            + emptyQuotes.getAbsolutePath());
    System.out.println("Equal: " + empty.equals(emptyQuotes));
}

C:\tempWindowsで実行すると、次の出力が生成されます。

Absolute path with quotes:C:\temp\"C:\myFolder"
Absolute path without quotes:C:\myFolder
Equal: false
Empty path with quotes:C:\temp
Empty path without quotes:C:\temp\""
Equal: false
于 2013-12-20T15:45:30.430 に答える