2010-07-16 2 views
21

У меня есть следующие строки кода.Проблема sysLoader.getResource() в java

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

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

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

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

sysloader -> UCP -> путь

Оказывает путь с символа% 20 вместо пространства

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

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

+0

Определить «не работает». Возвращает ли он «null»? Или возвращенный 'URL' не работает в некотором контексте? –

+0

Он возвращает NULL в URL – Vishal

ответ

31

Это известно 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()); 
+1

Вот соответствующий, но отчет помечен как «Не исправить»: http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=4466485. Эта ошибка/функция все еще существует в Java 1.7. – asmaier

+5

Более короткая версия без явного преобразования в строку и обратно в URI будет: 'URI uri = url.toURI();' 'FileInputStream fis = new FileInputStream (uri.getPath());' – Thomas

7

Используйте URLDecoder.decode() метод для замены %20 символов пробелами.

String path = URLDecoder.decode(url.getPath(), "UTF-8");

Пожалуйста, имейте в виду, что, когда ресурс находится в банке файл, который вы должны справиться с этим по-другому. См. здесь: How to access resources in jar where it can be present in multiple jar

0

чтобы получить URL файла из строки, когда путь содержит пробелы, то это то, что работает для меня:

File file = new File("/Users/work space/tempFile.txt"); 
URL url = file.toURI().toURL(); 

Согласно Javadocs, file.toURL() является deprecated:

Этот метод не автоматически избежать символов, являются незаконными в URL-адресах. Рекомендуется, чтобы новый код преобразовывал абстрактный путь в URL-адрес, сначала преобразовывая его в URI, используя метод toURI, а затем преобразовывая URI в URL-адрес с помощью метода URI.toURL.

Следовательно, используется file.toURI().toURL().

Для Java 7+, это подход может быть использован вместо:

URL url = Paths.get("/Users/work space/tempFile.txt").toURI().toURL()); 

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

Смежные вопросы