Файл не найден. Почему бы и нет? - PullRequest
4 голосов
/ 11 марта 2009

Хорошо, я пытаюсь загрузить файл в Java, используя этот код:

String file = "map.mp";
URL url = this.getClass().getResource(file);
System.out.println("url = " + url);
FileInputStream x = new FileInputStream("" + url);

и несмотря на то, что файл находится в той же папке, что и класс, он говорит, что не может его найти (да, он равен в блоке try catch в полном коде).

Однако он находит другой файл, используя тот же код с другим именем:

URL url = this.getClass().getResource("default.png");
System.out.println("url2 = " + this.getClass().getResource("default.png"));
BufferedImage img = ImageIO.read(url);

Почему мой код не может найти мой файл map.mp?

Ответы [ 4 ]

18 голосов
/ 11 марта 2009

Вы пытаетесь использовать URL, как будто это имя файла. Не будет Это будет что-то, начинающееся с file://. В других сценариях развертывания фактический файл может вообще не открываться - это может быть, например, файл jar. Вы можете использовать URL.getFile(), если вам действительно нужно - но лучше не делать.

Используйте getResourceAsStream вместо getResource() - это дает вам InputStream напрямую. В качестве альтернативы, продолжайте использовать getResource(), если вам нужен URL для чего-то другого, но затем используйте URL.openStream(), чтобы получить данные.

4 голосов
/ 11 марта 2009

FileInputStream принимает имя файла в качестве параметра, а не строку URL.

Обычный способ получить содержимое, на которое указывает URL, - openStream. Вы можете открыть поток для ресурса, не касаясь URL сами с помощью Class / ClassLoader.getResourceAsStream (он открывает URL-адрес в реализации).

Кроме того, вы можете открыть файл URL с:

InputStream in = FileInputStream(new File(url.toURI()));

Для ресурса это потребует наличия файлов необработанных классов вне jar в вашей файловой системе. JNLP (Java WebStart) имеет API для безопасного открытия файлов.

В целом: при конвертации в String используйте toString или String.valueOf, чтобы понять, что вы делаете. Также обратите внимание, что String является несколько слабо типизированным, так как тип не указывает на формат данных, которые он содержит, поэтому предпочитайте URI или File.

0 голосов
/ 21 октября 2016

У вас есть место на вашем пути? Вы видите% 20? Удалить это. Затем это будет работать: getResource (file), как и getResourceAsStream ().

Пробелы - это зло на путях. Всегда избегайте их.

0 голосов
/ 11 марта 2009

Попробуйте проверить, найден ли файл, к которому вы пытаетесь получить доступ, или нужный файл. Используйте Sys internals File Monitor . Он помогает отслеживать, к каким файлам обращался SO.

...