Неверный путь к файлу в java

Итак, мы получили это задание в курсе базового программирования на Java, и мы должны реализовать своего рода карточную колоду. Чтобы помочь нам в этом, они предоставили нам ресурсы, которые будут отображать графический интерфейс на экране, но при запуске моей программы я получаю исключение IOException, в котором говорится, что он не может прочитать входной файл, скорее всего, из-за неправильного имени пути. И я не знаю, как это исправить, мы даже не должны вмешиваться в этот код. В этом методе возникает ошибка:

private Image getImg(Card aCard) {
    File pathToFile = null;
    if (aCard == null) {
        pathToFile = new File("cardset-oxymoron/shade.gif");
    } else {
        String suits = "cdhs";
        char c = suits.charAt(aCard.getSuit());
        String fileName = String.format("%s/%02d%c.gif", "cardset-oxymoron", aCard.getRank(), c);
        pathToFile = new File(fileName);
    }
    Image img = null;
    try {
        img = ImageIO.read(pathToFile);
    } catch (IOException ex) {
        System.err.println("Failed to create image");
        ex.printStackTrace();
    }
    return img;
}

И согласно стеку ошибок (?) Он находится в строке 99, которая является

img = ImageIO.read(pathToFile); 

линия

Папка, в которой находятся карточки, находится внутри папки проекта, прямо между bin и src. используя отладчик IntelliJ, я вижу, что pathToFile - это «cardset-oxymoron \ 02d.gif». Имя файла правильное, так как все карточки имеют формат «[01-13] [c / d / h / s] .gif». Когда я щелкнул правой кнопкой мыши и скопировал путь к файлам внутри IntelliJ, он использовал косую черту вперед, а не обратную косую черту. Но затем я зарегистрировался в проводнике, и все было наоборот ... Я понятия не имею, где что-то не так, любой ввод будет очень признателен!

Так где же cardset-oxymoron/shade.gif по отношению к вашим файлам классов, вашей банке, вашей программе? Вы знаете, что такое каталог пользователя? Вы проверяли, где на самом деле смотрит Java? Вы пробовали использовать ресурсы, а не файлы? Вы искали подобные вопросы, поскольку здесь задавали подобные вопросы много, и ответы часто совпадают. Если бы это была моя программа, я бы поместил свои изображения в файл jar и получал их через ресурсы, а не файлы.

Hovercraft Full Of Eels 23.10.2018 23:00

Java может использовать разделитель пути / в Windows, Linux и MacOSX, так что это не проблема. Я предпочитаю всегда использовать косую черту в значениях пути Java-приложения. При запуске программы убедитесь, что рабочий каталог - это папка приложения. Этот cardset-oxymoron/shade.gif является относительным к рабочему (текущему) каталогу процесса.

Whome 23.10.2018 23:00

@HovercraftFullOfEels Извините, если это репост значительного размера, но я действительно не получил весь код, поэтому не знал, что искать, особенно с этим String.format. Но где бы я поместил папку jar и как мне получить доступ к ним как к ресурсам, а не к файлам?

PatchingMatching 23.10.2018 23:09

Сделаю, спасибо за помощь!

PatchingMatching 23.10.2018 23:18
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
5
1 727
1

Ответы 1

Согласно вашему коду, ваши файлы находятся в каталоге cardset-oxymoron относительно вашего каталога запуска JVM. Я не уверен насчет IntelliJ (я все время работаю с Eclipse и Maven), но это может быть каталог bin.

Вы можете проверить это, поместив эти 2 строки, чтобы увидеть, что это на самом деле (где-то до вашего фактического кода)

    File currentDir = new File("./");
    System.out.println(currentDir.getAbsolutePath());

Тогда ваш cardset-oxymoron должен находиться в этом каталоге. Или вы можете изменить путь к файлу соответствующим образом.

Например. если currentDir - bin, то pathToFile будет

 pathToFile = new File("../cardset-oxymoron/shade.gif");

а также fileName для другого случая.

... и это может привести к сбою, если OP запускает код в других системах или пытается получить доступ к изображениям из файла jar.

Hovercraft Full Of Eels 23.10.2018 23:43

да, это так ... но это первый шаг к пониманию расположения файлов для программ Java и правильной техники для них ...

Vadim 24.10.2018 01:41

Другие вопросы по теме