Java绝对路径在添加引号时添加了user.home属性 - Linux

时间:2013-09-05 22:06:47

标签: java linux jvm quotes absolute-path

如果我尝试在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"

有谁知道为什么会这样,以及如何让它发挥作用?

2 个答案:

答案 0 :(得分:0)

根据您的描述,您似乎在调用File(java.lang.String pathname)构造函数。

如果是这样,用于表示路径的String不应使用引号。

抽象路径名定义中的引号不被视为特殊字符,如java.io.File文档中所述。

  

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

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

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

示例:

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));
}
在Windows上的C:\temp中运行时,

将生成以下输出:

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

答案 1 :(得分: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""

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