我在運行時遇到了一個關于BufferedImage的問題。我正在加載一個 .png,但是 BufferedImage 是空的。我沒有得到一個IOException,而是一個NullPointerException。對我來說,最大的問題是,當我在netbeans中運行同樣的代碼時,他作業得很好。
我的代碼是
public Image loadImage() throwsIOException {
BufferedImage bufferedImage = ImageIO. read(new File(ApplicationProperties.getPath() ".wimdesktopimage.png") 。)
return SwingFXUtils.toFXImage(bufferedImage, null)。
}
ApplicationProperties.getPath()是靜態的,在運行時不會改變。
如果我把BufferedImage的宣告分開,并嘗試file.exists(),我得到一個真實的結果
uj5u.com熱心網友回復:
好吧,閱讀檔案。這當然是很奇怪的行為,但是檔案中為你說明了這一點:
使用從當前注冊的影像讀取器中自動選擇的影像讀取器對提供的檔案進行解碼后,回傳一個緩沖影像。檔案被包裹在一個ImageInputStream中。如果沒有注冊的ImageReader聲稱能夠讀取所產生的流,那么將回傳null。
(我添加了高亮部分)。換句話說,這是有意為之的行為。
這種方法很糟糕。
這個方法很糟糕,你不應該呼叫它。呼叫其他的方法,拿回一些控制權。通常,這樣的影像就像你的類檔案一樣是靜態的。當你創建這個程式時,你決定這些影像應該是什么,而你的用戶并不打算制作它們,編輯它們,或以其他方式對其產生任何影響。因此,將這些影像存盤在你 "存盤 "類檔案的地方是有意義的。在一個jar或jmod中,一起。
你可以要求 java 從它讀取類檔案的同一個地方讀取東西。我認為你可能應該使用這種機制來代替。你需要一個接收InputStream或URL的方法。幸運的是,read方法對這兩者都有多載。因此:
- 如果你有一個java檔案
MyApp.java,它以package com.foo;開始,那么你最終會有一個包含com/foo/MyApp.class條目的jar檔案;如果你運行jar tvf myapp.jar,你可以看到這個。 - 現在確保影像在同一個jar中,要么在
com/foo的(子目錄)中,要么在jar的根目錄中,由你選擇。比方說,你有com/foo/img/image.png在那個jar里面。
那么,要想從這個檔案中制作一個緩沖影像(BufferedImage):
BufferedImage img = ImageIO。 read(MyApp.class.getResource("img/image.png"/span>)。
return SwingFXUtils.toFXImage(img, null)。
如果你因為一些奇怪的原因必須從一個檔案中走出來,請控制這個程序,以便獲得非白癡式的錯誤處理(不幸的是,接受一個檔案的read方法符合白癡式的錯誤處理,所以你不想要這個方法):
try (FileInputStream in = new FileInputStream(new File(. ..))) {
BufferedImage img = ImageIO.read(in);
}
這樣,如果img現在是空的,你就知道這個檔案很可能被讀取了,但是它要么根本就不是一個有效的影像,要么就是java無法讀取的格式(例如,我不認為java可以保證讀取任何東西,除了png和jpg。所以它可能是HEIF/HEVC、TIFF、BMP等--據我所知,java無法讀取的東西)。
與你所做的對比,也可能是該檔案不存在,或者你的java行程沒有對該檔案的讀取權限。
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/321087.html
標籤:
上一篇:在java執行緒中的不一致
