Подтвердить что ты не робот

Проблема sysLoader.getResource() в java

У меня есть следующие строки кода.

sysLoader = (URLClassLoader)Thread.currentThread().getContextClassLoader();
url = sysLoader.getResource("tempFile.txt");

Это дает странную проблему. Если я запустил это из пути, где нет пробела в пути (имена папок), тогда он работает нормально. Но если путь содержит пробелы (строка "c:\New Folder..." ), то он не работает.

Как это решить?

EDIT: более подробно - я осмотрел объект sysloader.

sysloader → UCP → путь

Имеет путь с символом %20 вместо пространства

И поэтому все URL-адреса являются нулевыми.

Как разрешить это?

4b9b3361

Ответ 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());

Примечание. Если путь начинается с /, он считается абсолютным другим, принятым как относительный путь.