它「似乎」您正在嘗試從互聯網下載圖標,但您試圖將URL
視爲File
。
基本上,這是不可能的,File
將無法解析爲實際的物理文件。
相反,你應該使用ICODecoder#read(InputStream)
和URL#openStream
更多的東西一樣......
BufferedImage img = null;
InputStream is = null;
try {
// url begin an instance of java.net.URL
is = url.openStream();
img = ICODecoder.read(is);
} finally {
try {
is.close();
} catch (Exception exp) {
}
}
return img;
已更新,例如
Web資源不是File
,你不能像訪問它一樣訪問它,相反,你需要使用專門用於與互聯網/網絡進行交互的類。
例如...
import java.awt.EventQueue;
import java.awt.image.BufferedImage;
import java.io.IOException;
import java.io.InputStream;
import java.net.URL;
import java.util.List;
import javax.swing.ImageIcon;
import javax.swing.JOptionPane;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;
import net.sf.image4j.codec.ico.ICODecoder;
public class ReadFavicon {
public static void main(String[] args) {
new ReadFavicon();
}
public ReadFavicon() {
EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
try {
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
} catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {
}
try {
BufferedImage img = readIcon(new URL("https://secure.gravatar.com/favicon.ico"));
JOptionPane.showMessageDialog(null, "My FAVICON", "Icon", JOptionPane.PLAIN_MESSAGE, new ImageIcon(img));
} catch (IOException ex) {
ex.printStackTrace();
}
}
});
}
public BufferedImage readIcon(URL url) throws IOException {
BufferedImage img = null;
InputStream is = null;
try {
// url begin an instance of java.net.URL
is = url.openStream();
List<BufferedImage> imgs = ICODecoder.read(is);
img = imgs != null ? imgs.size() > 0 ? imgs.get(0) : null : null;
} finally {
try {
is.close();
} catch (Exception exp) {
}
}
return img;
}
}
更新了一些更多的想法
現在。我可能是錯的,但是當我運行你的代碼時,我遇到了嚴重的路徑問題......
讓我們假設原始的url /路徑是https://secure.gravatar.com/favicon.ico
,當你保存圖像時,你會這樣做。 ..
File outputfile = new File(path.replace("http://", ""));
File parent = outputfile.getParentFile();
parent.mkdir();
我們原來的路徑,這將導致https://secure.gravatar.com/favicon.ico
,這顯然是錯誤的一個outputfile
...
我們可以通過使用path.replace("https://", "")
以及糾正這個...
path = path.replace("http://", "");
path = path.replace("https://", "");
File outputfile = new File(path);
File parent = outputfile.getParentFile();
parent.mkdir();
現在,這導致outputfile
的secure.gravatar.com/favicon.ico
。因爲我不確定這是不是你想要的東西...但它確實對我有用......
現在,當你閱讀文件時,你做了這樣的事情......
public static BufferedImage parseImage(String url) throws IOException {
URL dest = new URL(url);
if (url.endsWith(".ico")) {
return ICODecoder.read(dest.openStream()).get(0);
} else if (url.endsWith(".bmp")) {
return BMPDecoder.read(dest.openStream());
} else {
return ImageIO.read(dest);
}
}
現在,沒有證據的contray,我必須承擔url
沒有改變,仍然是https://secure.gravatar.com/favicon.ico
......這意味着new File("https://secure.gravatar.com/favicon.ico")
將於是,再次產生一個無效的文件引用
,我分析的輸入...
url = url.replace("https://", "");
url = url.replace("http://", "");
File outputfile = new File(url);
String parentPath = outputfile.getParent();
String name = outputfile.getName();
url = parentPath + File.separator + name;
將會產生secure.gravatar.com\favicon.ico
這一切都做wnloaded,寫和閱讀沒有錯誤。
我保存圖像,存儲它,然後重新打開它 –
什麼是源路徑。 – MadProgrammer
完整路徑或相對於該項目? –