簡體   English   中英

Java / Groovy文件IO用其自己的內容替換圖像文件-為什么這樣做有效?

[英]Java/Groovy File IO Replacing an Image File with it's own Contents - Why Does This Work?

我有一些JPG文件,需要在運行時用其自身的JFIF標准化版本替換(我們使用的供應商提供的JPG文件沒有正確的標頭,因此它們在某些應用程序中不起作用)...我是能夠從現有圖像創建一個新文件,然后從該文件中獲取一個緩沖圖像,然后將內容直接寫回到該文件中,而不必將其刪除,因此它可以工作...

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

我的問題是為什么? 為什么文件最終大小不加倍? 為什么我不必先刪除它? 為什么能將文件對象帶到現有文件中,然后將其視為全新文件對象? 看來我認為是“文件”的東西實際上並不是java中的File對象,否則這根本就不起作用。

我的代碼完全按照我想要的去做,但是我不相信它總是會做的……似乎太簡單了

用於ImageIO.write的JavaDoc包括以下短語:

使用支持給定格式的任意ImageWriter將圖像寫入File 如果已經存在File ,則將其內容丟棄。

假設itFile ,就像您在讀取和寫入操作中都使用它一樣。

您是正確的:Java中的File對象所引用的內容與您聽到“ file”一詞時可能會想到的東西不同,就像文件系統上具有一定大小和內容的文檔中那樣。 它更像是一條路徑,實際上File實例和最新Path類的實例可以自由地相互轉換。

可以將Java File實例視為指向文件的指針。 它指向的假設文件可能存在也可能不存在。 如果存在,則可能是目錄。 在調用調用打開該文件所引用文件的File實例上運行的函數new FileInputStream(file)例如new FileInputStream(file) ,它不是“打開”的,以供讀取或寫入,即使這樣,File實例也不知道有關該打開文件的任何信息處理; 只有FileInputStream的新實例可以。

因此, ImageIO.read(...)正在打開文件,讀取其內容,最后關閉它。 ImageIO.write(...)是在打開文件后刪除文件或刪除其內容,然后對其進行寫入,最后關閉它。 它們都在同一個File實例上操作,並且繼續指向相同的文件路徑,但是此后該路徑上的文件可以完全不同。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM