Из документации URI#resolve(URI)
:
[...]
В противном случае этот метод создает новую иерархическую структуру URI в соответствии с RF C 2396 , раздел 5.2; то есть:
- Новый URI создается со схемой этого URI и компонентами запроса и фрагмента данного URI.
- Если данный URI имеет компонент полномочий, тогда полномочия нового URI и путь берется из заданного URI.
- В противном случае новый компонент полномочий URI копируется из этого URI, и его путь вычисляется следующим образом:
- Если путь данного URI является абсолютным затем путь нового URI берется из данного URI. [выделение добавлено]
- В противном случае путь данного 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