getClassLoader (). getResource (filepath) возвращает нулевой указатель - PullRequest
1 голос
/ 01 декабря 2011

Я использую метод для динамического генерирования файлов XML для исследовательского проекта, они помещаются в загрузчик, который читает из пути к файлу, я не имею никакого контроля над тем, как загрузчик обрабатывает вещи (в противном случае я бы передать внутреннее представление XML вместо манипуляций с временными файлами), я использую этот код для сохранения файла:

File outputs = File.createTempFile("lvlFile", ".tmp.xml");

FileWriter fw = new FileWriter(outputs);

fw.write(el.asXML());

fw.close();

// filenames is my list of file paths which gets returned and passed around

filenames.add(outputs.getAbsolutePath());

Теперь я уверен, что данный файл записывается напрямую. Если я печатаю output.getAbsolutePath () и перехожу туда через терминал для проверки файлов, все генерируется и записывается правильно, поэтому все правильно в файловой системе. Тем не менее, этот код:

URL url = this.getClass().getClassLoader().getResource(_levelFile);

Где _levelFile - одно из моих имен файлов, сгенерированных выше, url будет нулевым. Путь не поврежден или что-то еще, печать проверяет, что _levelFile указывает на правильный путь. Тот же код успешно выполнен для других файлов. Кроме того, эта ошибка, похоже, не связана с тем, использую ли я getPath (), getCanonicalPath () или getAbsolutePath (), дальнейшая установка output.isReadable (true) ничего не делает.

Есть идеи? Пожалуйста, не предлагайте альтернативы структуре url = url =, я не имею никакого контроля над этим кодом *, я обязан изменить свой код так, чтобы URL был установлен правильно.

(*) По крайней мере без ЗНАЧИТЕЛЬНЫХ усилий переписать большую часть фреймворка, с которым я работаю, даже при том, что текущий код успешен во всех других случаях.

Edit:

Опять же, я не могу использовать альтернативу URL-коду, это часть загрузчика, к которой я не могу прикоснуться. Кроме того, загрузка завершается неудачно, даже если я задаю путь к временному файлу в том же каталоге, из которого поступают мои успешно загруженные файлы.

Ответы [ 2 ]

1 голос
/ 01 декабря 2011

Я предполагаю, что ClassLoader будет искать только ресурсы в пределах пути к классам - который, вероятно, не включает /tmp. Я не уверен, поддерживает ли он абсолютные пути. Это могло бы просто интерпретировать их как относительно корня пути к индивидуальному классу.

Как насчет использования _levelFile.toURI().toURL() вместо?

0 голосов
/ 01 декабря 2011

Вы создаете файл в файловой системе, а затем пытаетесь прочитать его как ресурс.Ресурс - это то, где JVM берет свои классы, то есть путь к классам.Так что эта операция будет работать, только если вы записываете файл в ваш путь к классам.

И даже если это правильно, будьте осторожны: если, например, вы запускаете Eclipse, ваш процесс, вероятно, не "увидит" новый ресурс, пока вы не обновите свое рабочее пространство.

Теперь мой вопрос: действительно ли вы уверены, что хотите читать файлы как ресурсы?Похоже, вам просто нужно создать новый FileInputStream(_levelFile) и прочитать с него.

Редактировать

@ Anonymouse прав.Вы создаете временный файл, используя 2-аргументную версию createTempFile(), поэтому ваш файл создается во временном каталоге.Вероятность того, что он попадет в ваш путь к классам, очень мала ... :) Так что, если вы хотите прочитать его, вам нужно получить его путь или просто использовать его при создании входного потока:

File outputs = File.createTempFile("lvlFile", ".tmp.xml");
..........................
InputStream in = new FileInputStream(ouptuts);
// now read from this stream.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...