Проблема sysLoader.getResource() в java
У меня есть следующие строки кода.
sysLoader = (URLClassLoader)Thread.currentThread().getContextClassLoader();
url = sysLoader.getResource("tempFile.txt");
Это дает странную проблему. Если я запустил это из пути, где нет пробела в пути (имена папок), тогда он работает нормально. Но если путь содержит пробелы (строка "c:\New Folder..." ), то он не работает.
Как это решить?
EDIT: более подробно - я осмотрел объект sysloader.
sysloader → UCP → путь
Имеет путь с символом %20 вместо пространства
И поэтому все URL-адреса являются нулевыми.
Как разрешить это?
Ответы
Ответ 1
Это известно Sun/Oracle, их советы - использовать объекты URI, которые удаляют %20 символов:
Вместо этого:
FileInputStream fis = new FileInputStream(url.getFile());
вы можете принудительно декодировать любые% -экранированные символы, сначала преобразуя URL-адрес в URI, а затем используя компонент пути URI в качестве имени файла:
URI uri = new URI(url.toString());
FileInputStream fis = new FileInputStream(uri.getPath());
Ответ 2
Используйте URLDecoder.decode()
метод для замены символов %20
пробелами.
String path = URLDecoder.decode(url.getPath(), "UTF-8");
Пожалуйста, имейте в виду, что когда ресурс находится в файле jar, вам нужно обращаться с ним по-другому. См. здесь: Как получить доступ к ресурсам в банке, где он может присутствовать в нескольких банках
Ответ 3
Чтобы получить URL-адрес файла из строки, когда путь содержит пробелы, это то, что сработало для меня:
File file = new File("/Users/work space/tempFile.txt");
URL url = file.toURI().toURL();
Согласно Javadocs, file.toURL()
устарел:
Этот метод автоматически не пропускает символы, которые являются незаконными в URL-адресах. Рекомендуется, чтобы новый код преобразовывал абстрактный путь в URL-адрес, сначала преобразовывая его в URI, используя метод toURI, а затем преобразовывая URI в URL-адрес с помощью метода URI.toURL.
Следовательно, используется file.toURI().toURL()
.
Для Java 7+ вместо этого можно использовать подход:
URL url = Paths.get("/Users/work space/tempFile.txt").toURI().toURL());
Примечание. Если путь начинается с /
, он считается абсолютным другим, принятым как относительный путь.