Как я могу загружать / читать изображения в JAVA

#java

#java

Вопрос:

Я пытаюсь загрузить изображение на Java, но я сталкиваюсь с этой ошибкой:

 javax.imageio.IIOException: Can't read input file!
    at java.desktop/javax.imageio.ImageIO.read(ImageIO.java:1308)
    at Main.main(Main.java:10)
  

Это мой код:

 import javax.imageio.ImageIO;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;

public class Main {
    private static BufferedImage tmp;
    public static void main(String[] args) {
        try {
             tmp = ImageIO.read(new File("defaults.png"));
            System.out.println("reading completed ");
        }catch (IOException e){
            System.out.println("Error loading image ");
            e.printStackTrace();
        }
    }
}
  

Комментарии:

1. Это полное сообщение об исключении, которое вы получаете, или вы вырезали какую-либо часть сообщения об ошибке?

2. я вырезал System.out.println с сообщением об ошибке загрузки изображения только для того, чтобы это было полное исключение

3. Ну, я бы сказал, что либо 1) файл не существует, либо 2) это не файл изображения.

4. Существует ли файл? Можете ли вы открыть его в программе просмотра изображений? У вас есть разрешение на чтение файла?

5. Обратите внимание, что в соответствии с опубликованным вами кодом java будет искать файл defaults.png в рабочем каталоге, который является значением, возвращаемым System.getProperty("user.dir") .

Ответ №1:

Это конкретное сообщение об ошибке выдается, когда файл не может быть прочитан. Проверьте исходный код ImageIO.read() :

 if (!input.canRead()) {
    throw new IIOException("Can't read input file!");
}
  

Он использует File.canRead() метод для проверки, можно ли прочитать файл. В документации по этому методу говорится:

ВОЗВРАТ:

true тогда и только тогда, когда файл, указанный этим абстрактным путем, существует и может быть прочитан приложением; false в противном случае

Итак, файл, который вы пытаетесь загрузить, должен существовать, и разрешение должно быть правильным. Когда exists() метод возвращает false для вашего File объекта, вы знаете, что файл, который вы пытаетесь загрузить, не существует (в рабочем каталоге, в котором вы находитесь). Когда файл действительно существует, проблема с разрешением заключается в том, что вашему приложению не разрешено читать файл.

Ответ №2:

В подобном случае я бы предложил:

  • Выйдите из абсолютного пути к файлу, чтобы проверить, что система ищет его там, где вы думаете, что она его ищет

  • Попробуйте прочитать файл с помощью одного из более новых вызовов file API (доступных через класс Files), который, как правило, выдает более понятные ошибки, объясняющие, почему файл не может быть прочитан:

       File f = new File("defaults.png");
      System.out.println(f.getAbsolutePath());
    
      try {
          Path p = f.toPath();
          Files.readAllBytes(p);
      } catch (IOException ioex) {
          ioex.printStackTrace();
      }