У меня есть ресурс, который был открыт с помощью URL-адреса файла для загрузки с сетевого ресурса в сети Windows, например, file:////remotemachine/my/path/spec.txt
.
Этот файл указывает путь к другому ресурсу, который мне нужно загрузить.Я использую метод URI.resolve(String)
для создания URI для этого ресурса.Это вызывает проблему, поскольку вновь созданный ресурс File не содержит необходимых слэшей для указания удаленного хоста.Вместо
file:////remotemachine/my/path/data.dat
я получаю
file:///remotemachine/my/path/data.dat
Отсутствующая косая черта означает, что файл пытается быть загружен с локальной машины, где ресурс не существует (и при этом путь не существует).
Это делает то же самое, если я использую IP-адреса вместо имен компьютеров.Если я использую сопоставленное имя файла, например, file:///M:/path/spec.txt
, тогда файл ресурса правильно разрешается в file:///M:/path/data.dat
.Также, если я использую путь протокола http, URI разрешается правильно.
Может ли кто-нибудь определить, есть ли у меня недопонимание при повторном разрешении файловых URI, если он является сетевым, если это ошибка в Java?соответствующий раздел кода
private Tile(URI documentBase, XPath x, Node n) throws XPathExpressionException, IOException
{
String imagePath = (String) x.evaluate("FileName", n, XPathConstants.STRING);
this.imageURL = documentBase.resolve(imagePath).toURL();
}
Обновление
Я нашел решение для своей проблемы
private Tile(URI documentBase, XPath x, Node n) throws XPathExpressionException, IOException
{
boolean isRemoteHostFile = documentBase.getScheme().equals("file") &&
documentBase.getPath().startsWith("//");
String imagePath = (String) x.evaluate("FileName", n, XPathConstants.STRING);
imageURL = documentBase.resolve(imagePath).toURL();
if ( isRemoteHostFile )
{
imageURL = new URL(imageURL.getProtocol()+":///"+imageURL.getPath());
}
}
Однако явсе еще любопытно, является ли File: вещь ошибкой Java, проблемой URI или просто большим недопониманием того, как это работает с моей стороны.