2014-01-11 28 views
31

我想了解Java在创建File对象时解析相对路径的方式。Java如何在新File()中解析相对路径?

OS使用:视窗

对于下面的代码片段,我得到了IOException,因为它无法找到路径:

@Test 
public void testPathConversion() { 
     File f = new File("test/test.txt"); 
     try { 
      f.createNewFile(); 
      System.out.println(f.getPath()); 
      System.out.println(f.getAbsolutePath());  
      System.out.println(f.getCanonicalPath()); 
     } catch (Exception e) { 
      e.printStackTrace(); 
     } 
} 

我的理解这里,爪哇将其视为绝对回报提供的路径路径不存在时发生错误。所以这是有道理的。

当我更新了上面的代码中使用相对路径:

@Test 
    public void testPathConversion() { 
     File f = new File("test/../test.txt"); 
     try { 
      f.createNewFile(); 
      System.out.println(f.getPath()); 
      System.out.println(f.getAbsolutePath());  
      System.out.println(f.getCanonicalPath()); 
     } catch (Exception e) { 
      e.printStackTrace(); 
     }  
    } 

它创建一个新的文件,并提供以下的输出:

test\..\test.txt 
C:\JavaForTesters\test\..\test.txt 
C:\JavaForTesters\test.txt 

在这种情况下,我的假设是,即使所提供的路径不存在,因为路径包含“/../”,java会将其视为相对路径并在user.dir中创建该文件。所以这也是有道理的。

但如果我更新下面的相对路径:

@Test 
    public void testPathConversion() { 
     File f = new File("test/../../test.txt"); 
     try { 
      f.createNewFile(); 
      System.out.println(f.getPath()); 
      System.out.println(f.getAbsolutePath()); 
      System.out.println(f.getCanonicalPath()); 
     } catch (Exception e) { 
      e.printStackTrace(); 
     } 
    } 

然后我得到IOException异常:访问被拒绝。

我的问题是:

  1. 为什么"test/../test.txt"被视为相对路径和"user.dir"创建文件,但"test/../../test.txt"返回一个错误?它在哪里尝试为路径"test/../../test.txt"创建文件?
  2. 当找不到指定的相对路径时,该文件似乎在user.dir中创建。所以,在我看来,以下两种情况做同样的事情:

    //scenario 1 
    File f = new File("test/../test.txt"); 
    f.createNewFile(); 
    
    //scenario 2 
    File f = new File("test.txt"); 
    f.createNewFile(); 
    

那么,有没有一个真正的世界的案例,其中一个会用,而不是场景2场景1?

我想我错过了一些很明显的东西,或者从根本上误解了相对路径。我浏览了File的Java文档,但无法找到解释。关于相对路径,在Stack Overflow中发布了相当多的问题,但是我查找的是针对特定场景的,而不是关于如何解析相对路径。

如果有人能解释我这是如何工作的或指向一些相关链接,这将是非常好的吗?

+0

请注意,'user.dir'是一个很不稳定的地方,它应该依赖于脆弱。另一个需要考虑的因素是应用程序。可能没有安装在它有*写权限的地方。**将文件放在'user.home'(的子目录)中会更加优化和健壮。请参阅[这个答案](http://stackoverflow.com/a/10166623/418556)一个简短的例子。 –

+0

注意:'test/test.txt'和'test /../ test.txt'都是相对路径。这个意义上的相对与嵌入式“..”组件的存在无关。 – Boann

回答

17

有一个working directory的概念。
此目录由.(点)表示。
在相对路径中,其他所有内容都与其相关。

简单地说,.(工作目录)就是运行程序的地方。
在某些情况下,工作目录可以更改,但通常这是
点代表的是什么。我认为你的情况是C:\JavaForTesters\

所以test\..\test.txt表示:子目录在我的工作目录test
,然后一个级别,那么
文件test.txt。这与test.txt基本相同。

欲了解更多详情请点击这里。

http://docs.oracle.com/javase/7/docs/api/java/io/File.html

http://docs.oracle.com/javase/tutorial/essential/io/pathOps.html

5

工作目录是一个共同的理念在几乎所有的操作系​​统和程序语言等,这是在程序运行的目录。这通常是(但并不总是,有办法改变它)应用程序所在的目录。

相对路径是指没有驱动器说明符的路径。因此,在linux中,它们不是以/开头的,它们并不以C:\等开头,它们始终从您的工作目录开始。

绝对路径是以驱动器(或网络路径的机器)说明符开头的路径。他们总是从开车的那一刻开始。

7

当您的路径在Unix中或在java资源路径中的根目录开头,即C:\/时,它被认为是绝对路径。其他一切都是相对的,所以

new File("test.txt") is the same as new File("./test.txt") 

new File("test/../test.txt") is the same as new File("./test/../test.txt") 

getAbsolutePathgetCanonicalPath之间的主要区别是,第一个串接一个父和子路径,因此它可能包含黑点:...getCanonicalPath将始终返回特定文件的相同路径。

注:File.equals使用路径(getAbsolutePath)比较文件的抽象形式,所以这意味着,对于相同的两个File对象可能不等于和File s为不安全的收藏使用像MapSet

0

在Windows和Netbeans的可以设置相对路径:如果你有内部Source Packages 代码

new FileReader("src/PACKAGE_NAME/FILENAME"); 

new FileReader("src\\PACKAGE_NAME\\FILENAME"); 

在Linux和Netbeans,你可以设置为相对路径我不知道是否它是相同的日食或其他IDE

0

只有略有关系的问题,但试图包装你的头阿鲁找到这个。如此不直观:

import java.nio.file.*; 
class Main { 
    public static void main(String[] args) { 
    Path p1 = Paths.get("/personal/./photos/./readme.txt"); 
    Path p2 = Paths.get("/personal/index.html"); 
    Path p3 = p1.relativize(p2); 
    System.out.println(p3); //prints ../../../../index.html !! 
    } 
}