Java / Groovy File IO Замена файла изображения собственным содержимым - Почему это работает? - PullRequest
0 голосов
/ 18 марта 2010

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

imageSrcFolder.eachFileMatch ( ~/.*\.jpg/, {
    BufferedImage bi = ImageIO.read( it )
    ImageIO.write( bi, "jpg", it )
});

У меня вопрос, почему? Почему размер файла не удваивается? Почему я не должен сначала удалить его? Почему я могу взять файловый объект в существующий файл, а затем обработать его, как если бы он был новым? Кажется, то, что я считаю «файлом», - это не то, чем на самом деле является объект File в Java, иначе это не сработает вообще.

Мой код делает именно то, что я хочу, но я не уверен, что так будет всегда ... это просто кажется слишком легким

Ответы [ 2 ]

3 голосов
/ 18 марта 2010

JavaDoc для ImageIO.write включает эту фразу:

Записывает изображение, используя произвольный ImageWriter, поддерживающий данное отформатировать в File. Если уже есть File присутствует, его содержимое отбрасываются.

Предполагается, что it является File, поскольку вы использовали его как в операциях чтения, так и записи.

0 голосов
/ 17 сентября 2016

Вы правы: объект File в Java не ссылается на то же, что вы можете подумать, когда слышите слово «file», как в документе вашей файловой системы с определенным размером и содержанием. Это больше похоже на путь, и на самом деле экземпляры File и экземпляры более нового класса Path могут быть свободно преобразованы друг в друга.

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

Итак, ImageIO.read(...) открывает файл, читает его содержимое и, наконец, закрывает его. ImageIO.write(...) либо удаляет файл, либо удаляет его содержимое после открытия, записи в него и, наконец, закрытия. Они оба работают с одним и тем же экземпляром файла, и он продолжает указывать на один и тот же путь к файлу, но впоследствии файл по этому пути может быть совершенно другим.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...