windows - папка пользователя со специальным символом - & gt; class.getResource возвращает null [duplicate]

Вот трюк:

<?php 
 $name = 'PHP variable';
 echo '<script>';
 echo 'var name = ' . json_encode($name) . ';';
 echo '</script>';
<?
<script>
  console.log("i am everywhere " + name);
</script>
6
задан Velth 4 July 2013 в 10:19
поделиться

2 ответа

Вероятно, из-за этой ошибки или любой из многих подобных ошибок в базе данных ошибок Java:

http://bugs.sun.com/view_bug.do?bug_id=4523159

Причина в том, что «! /» в jar-URL интерпретируется как разделитель между именем файла JAR и курсором в самом JAR-файле. Если имя каталога заканчивается на!, Последовательность символов «! /» В конце каталога неверно интерпретируется. В вашем случае вы фактически пытаетесь получить доступ к ресурсу со следующим URL:

jar: file: /// d: / test1231 @ # !!! /test.jar! / Images / Logo. png

Ошибка была открыта почти 12 лет и вряд ли будет исправлена. На самом деле я не знаю, как это можно исправить, не нарушая других вещей. Проблема заключается в конструктивном решении использовать! как символ со специальным значением (разделитель) в схеме URL-адресов для файлов JAR:

jar:<URL for JAR file>!/<path within the JAR file>

Поскольку восклицательный знак является допустимым символом в URL-адресах, это может происходить как в URL-адресе JAR-файла сам, а также на пути в JAR-файле, что делает невозможным в некоторых случаях найти фактический разделитель «! /».

7
ответ дан jarnbjo 18 August 2018 в 00:28
поделиться
  • 1
    Я решил, что ему нужно что-то делать с Java и анализировать URL-адреса с помощью «! /», Но я просто не мог поверить, что это будет ошибкой. Во всяком случае, может ли быть обходной путь для решения этой проблемы? – Velth 4 July 2013 в 10:28
  • 2
    Нет, как также отмечено в ошибке, с которой я связан, нет никакого тривиального обходного пути для этой проблемы. – jarnbjo 4 July 2013 в 11:07

Простая работа для Windows заключается в использовании «\» вместо «/» в пути. Это означало бы, что последовательность символов «! /» Будет найдена после полного пути. Например:

new URL("jar:file:\\d:\\test1231@#!!!\\test.jar!/images/Logo.png");

Мой код:

File jar = new File(jarPath + "/" + jarName);
URL url = new URL("jar:" + jar.toURI() + "!" + dataFilePath);
InputStream stream = null;
try {
    stream = url.openStream();
} catch (FileNotFoundException e) {
    // Windows fix
    URL urlFix = new URL("jar:" + jar.toURI().toString().replace('/', '\\')
        + "!" + dataFilePath);
    stream = urlFix.openStream();
}

Я использую toURI (), потому что он обрабатывает такие вещи, как пробелы.

Исправления:

Само исправление предназначалось бы для Java, чтобы проверить, существует ли файл, и если не продолжать следующий разделитель (часть!!) URL-адреса до тех пор, пока разделители не будут исчерпаны, а затем выбросите исключение. Поэтому он увидит, что «d: \ test1231 @ # !!» бросает java.io.FileNotFoundException и затем пытается «d: \ test1231 @ # !!! \ test.jar», который существует. Таким образом, не имеет значения, есть ли «!» в пути к файлу или в файлах jar.

В качестве альтернативы «! /» можно переключить на другое, что является незаконным именем файла или чем-то конкретным (например, «jarpath:»).

В качестве альтернативы сделать путь к файлу jar другим параметром.

Примечание:

Возможно, что-то можно переопределить, поменять обработчик или изменить код, чтобы открыть файл сначала загляните в файл jar позже, но я не посмотрел.

1
ответ дан Arckaroph 18 August 2018 в 00:28
поделиться
Другие вопросы по тегам:

Похожие вопросы: