Вы правы: объект File в Java не ссылается на то же, что вы можете подумать, когда слышите слово «file», как в документе вашей файловой системы с определенным размером и содержанием. Это больше похоже на путь, и на самом деле экземпляры File и экземпляры более нового класса Path могут быть свободно преобразованы друг в друга.
Экземпляр Java-файла можно рассматривать как указатель на файл. Гипотетический файл, на который он указывает, может существовать или не существовать. Если он существует, это может быть каталог. Он не «открыт» для чтения или записи, пока вы не вызовете функции, работающие с экземпляром File, которые открывают файл, к которому он обращается, например new FileInputStream(file)
, и даже тогда экземпляр File ничего не знает об этом дескрипторе открытого файла; делает только новый экземпляр FileInputStream.
Итак, ImageIO.read(...)
открывает файл, читает его содержимое и, наконец, закрывает его. ImageIO.write(...)
либо удаляет файл, либо удаляет его содержимое после открытия, записи в него и, наконец, закрытия. Они оба работают с одним и тем же экземпляром файла, и он продолжает указывать на один и тот же путь к файлу, но впоследствии файл по этому пути может быть совершенно другим.