Java Проблема с разрешением локальной файловой системы URI - PullRequest
1 голос
/ 19 апреля 2020

У меня есть два 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?

Ответы [ 2 ]

2 голосов
/ 19 апреля 2020

Для разрешения второй 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
1 голос
/ 19 апреля 2020

Из документации URI#resolve(URI):

[...]

В противном случае этот метод создает новую иерархическую структуру URI в соответствии с RF C 2396 , раздел 5.2; то есть:

  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 сам по себе называется абсолютным, если он начинается с символом sla sh ('/') [выделение добавлено] ; в противном случае это относительно. Путь иерархического 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...