2013-08-26 25 views
0

我目前正在一個項目,我試圖下載一個.ico文件,但由於一些奇怪的原因,我似乎無法以編程方式打開它一次下載。然而,我可以打開使用任何圖像編輯器或查看器保存的圖像。我的代碼:保存互聯網圖標,然後重新打開導致EOF與image4j

public static BufferedImage parseImageLocal(String url) throws IOException { 
     if (url.endsWith(".ico")) { 
      return ICODecoder.read(new File(url)).get(0); 
     } else if (url.endsWith(".bmp")) { 
      return BMPDecoder.read(new File(url)); 

     } else { 
      return ImageIO.read(new File(url)); 
     } 
    } 

    public static void saveImage(BufferedImage img, String path) 
      throws IOException { 

     File outputfile = new File(path.replace("http://", "")); 
     File parent = outputfile.getParentFile(); 
     parent.mkdir(); 
     if (!outputfile.exists()) { 
      outputfile.createNewFile(); 
     } 
     if (path.endsWith(".ico")) { 
      ICOEncoder.write(img, outputfile); 
     } else if (path.endsWith(".bmp")) { 
      BMPEncoder.write(img, outputfile); 
     } else { 
      ImageIO.write(img, "png", outputfile); 
     } 
    } 

這是我從網上下載圖片:

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); 
     } 
    } 

的錯誤是在這條線:

return ICODecoder.read(new File(url)).get(0); 

回答

1

它「似乎」您正在嘗試從互聯網下載圖標,但您試圖將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,你不能像訪問它一樣訪問它,相反,你需要使用專門用於與互聯網/網絡進行交互的類。

例如...

enter image description here

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(); 

現在,這導致outputfilesecure.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,寫和閱讀沒有錯誤。

+0

我保存圖像,存儲它,然後重新打開它 –

+0

什麼是源路徑。 – MadProgrammer

+0

完整路徑或相對於該項目? –

相關問題