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

抽象路径名有两个组成部分:

  1. 可选的与系统相关的前缀字符串,例如磁盘驱动器说明符、“/”表示 UNIX >root 目录或“\\”表示 Microsoft Windows UNC 路径名,以及
  2. 零个或多个字符串名称的序列。

由于引号不是特殊字符,因此它们被视为name的一部分。

例子:

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:\temp在 Windows 上运行时将产生以下输出:

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 回答
0

在 Windows 中,不带空格的文件名和相同的引号应指相同的文件(或文件夹)。例如,如果我们有一个名为 c:\uni2 的文件夹,则两个命令行

   dir c:\uni2
   dir "c:\uni2"

应该给出相同的结果。但是在java中

  String rename;
  boolean ya;

  File f1 = new File ("C:/UNI2");    // given that exists and it is a directory
  ya = f1.exists();                  // true
  ya = f1.isFile();                  // false
  ya = f1.isDirectory();             // true
  rename = f1.getAbsolutePath();     // "C:\\UNI2"


  f1 = new File ("\"C:/UNI2\"");     // in windows this should be the same directory!!
  ya = f1.exists();                  // false
  ya = f1.isFile();                  // false
  ya = f1.isDirectory();             // false
  rename = f1.getAbsolutePath();     // "C:\tmp\"C:\UNI2""

这不是预期的行为(即使它已记录在案)。

于 2020-06-18T18:59:21.083 回答