【问题标题】:Java URI local file system resolve issueJava URI 本地文件系统解决问题
【发布时间】:2020-08-01 10:06:55
【问题描述】:

我有两个 URI,我想从第二个 URI 连接文件,如下所示: ...

  URI uri1 = new URI("file:/C:/Users/TestUser/Desktop/Example_File/");
  URI uri2 = new URI("/Example_File.xlsx");

after uri1.resolve(uri2) I want to get -> file:/C:/Users/TestUser/Desktop/Example_File/Example_File.xlsx

... 上面的解析 uri 返回文件:/Exampe_File.xlsx,这不是我的预期结果。如何连接这两个 URI?

【问题讨论】:

    标签: java file uri system


    【解决方案1】:

    要解决,第二个URI 不应有前导/

    URI uri1 = new URI("C:/Users/TestUser/Desktop/Example_File/");
    URI uri2 = new URI("Example_File.xlsx");
    System.out.println(uri1.resolve(uri2)); 
    // C:/Users/TestUser/Desktop/Example_File/Example_File.xlsx
    

    【讨论】:

      【解决方案2】:

      来自URI#resolve(URI)的文档:

      [...]

      否则此方法以与RFC 2396,第 5.2 节一致的方式构造新的分层 URI;那就是:

      1. 使用此 URI 的方案以及给定 URI 的查询和片段组件构造一个新的 URI。
      2. 如果给定 URI 具有权限组件,则新 URI 的权限和路径取自给定 URI。
      3. 否则,新 URI 的权限组件将从该 URI 复制,其路径计算如下:
        1. 如果给定 URI 的路径是绝对路径,则新 URI 的路径取自给定 URI。 [强调添加]
        2. 否则给定 URI 的路径是相对的,因此新 URI 的路径是通过根据该 URI 的路径解析给定 URI 的路径来计算的。这是通过将此 URI 路径的最后一段(如果有的话)与给定 URI 的路径连接起来,然后像调用 normalize 方法一样对结果进行规范化来完成的。

      URI 的类文档指出:

      如果分层 URI 的路径组件以斜杠字符 ('/') 开头,则它本身就是绝对的 [强调添加];否则是相对的。分层 URI 的路径要么是绝对的,要么是指定权限的,它始终是绝对的。

      由于您拥有URI uri2 = new URI("/Example_File.xlsx"),因此您正在解析具有 绝对路径 的 URI 与另一个 URI。这意味着,根据文档,生成的 URI 路径将是 uri2 的路径。要解决此问题,请将 uri2 的路径设为相对路径。例如:

      URI uri1 = new URI("file:/C:/Users/TestUser/Desktop/Example_File/");
      URI uri2 = new URI("Example_File.xlsx"); // notice no leading slash
      
      System.out.println(uri1.resolve(uri2));
      

      输出:

      file:/C:/Users/TestUser/Desktop/Example_File/Example_File.xlsx
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2017-11-22
        • 2020-02-17
        • 2012-04-06
        • 1970-01-01
        • 1970-01-01
        • 2016-11-22
        • 1970-01-01
        • 2016-01-01
        相关资源
        最近更新 更多