URI不是绝对的吗?

时间:2017-03-04 03:29:59

标签: java

我有一个文件

/user/guest/work/test/src/main/java/Test.java

File - 对象:

File f = new File("/user/guest/work/test/src/main/java/Test.java");

我需要这个输出

System.out.println(f);                   ->                       src/main/java/Test.java
System.out.println(f.getAbsolutePath()); -> /user/guest/work/test/src/main/java/Test.java

我试过了:

File relativeTo = new File("/user/guest/work/test");
new File(relativeTo.toURI().relativize(f.toURI()));

但它正在抛出

java.lang.IllegalArgumentException: URI is not absolute
   at java.io.File.<init>(File.java:416)
   at Test.<init>(Test.java:43)

如何获得所需的输出?

2 个答案:

答案 0 :(得分:3)

您可以使用路径解析来重新激活文件路径

  File f = new File("/user/guest/workspace/test/src/main/java/Test.java");
  File relativeTo = new File("/user/guest/workspace/test");
  System.out.println(new File(relativeTo.toPath().resolve(f.toPath()).toUri()));

答案 1 :(得分:3)

relativize返回一个URI。

new File(URI uri)需要......

  

uri - 绝对,分层URI

您可以尝试使用String构造函数。

new File(relativeTo.toURI().relativize(f.toURI()).toString());

您可以通过其他方式访问该文件,但

例如,您可以尝试使用java.nio.file.Path API代替java.io.File

喜欢

Path path = Paths.get("/", "user", "guest", "workspace", 
    "test", "src", "main", "java", "Test.java");
Path other = ...
Path relPath = other.relativize(path);

//    relPath.toString(); // print it
//    relPath.toFile();   // get a file