JSOUP如何優秀的下載JPEG等二進制圖像

引言

  • JSOUP默認是不支持解析JPEG等二進制圖像的,解決方法也很簡單,只須要加上Jsoup.ignoreContentType(true)這一行代碼就能夠。關於這一點的緣由,來看看官方API說明。
  • Connection (jsoup Java HTML Parser 1.11.3 API)

解釋

  • 鏈接ignoreContentType(boolean ignoreContentType)
    在解析響應時忽略文檔的內容類型。默認狀況下,這是錯誤的,未識別的內容類型將致使拋出IOException。(例如,經過嘗試解析JPEG二進制映像來防止產生垃圾)。設置爲true以強制執行解析嘗試,而不考慮內容類型。
  • 參數:
    ignoreContentType—若是您想要將響應解析爲文檔時忽略的內容類型設置爲true。
  • 返回:
    這個鏈接,連接

完整示例

這個示例是完整下載一張 圖片 的全部步驟。html

@Test
    public void test() throws IOException {
        Response response = Jsoup.connect("http://sjbz.fd.zol-img.com.cn/t_s640x960c/g5/M00/0F/09/ChMkJlfJQcWIDXJEAAN5CfxwAOYAAU7hwBVxTQAA3kh337.jpg")
                .ignoreContentType(true)
                .method(Method.GET)
                .execute();
        byte[] bytes = response.bodyAsBytes();
        File file = new File("D:\\img.png");
        FileOutputStream fileOutputStream = new FileOutputStream(file);
        fileOutputStream.write(bytes);
        fileOutputStream.flush();
        fileOutputStream.close();
    }

上面的方法很簡單,可是我並不推薦使用。java

  • 緣由:
  • 咱們有必要知道不帶緩衝的操做,每讀一個字節就要寫入一個字節,因爲涉及磁盤的IO操做相比內存的操做要慢不少,因此不帶緩衝的流效率很低。帶緩衝的流,能夠一次讀不少字節,但不向磁盤中寫入,只是先放到內存裏。等湊夠了緩衝區大小的時候一次性寫入磁盤,這種方式能夠減小磁盤操做次數,速度就會提升不少!

完美方案

@Test
    public void test() throws IOException {
        Response response = Jsoup.connect("http://sjbz.fd.zol-img.com.cn/t_s640x960c/g5/M00/0F/09/ChMkJlfJQcWIDXJEAAN5CfxwAOYAAU7hwBVxTQAA3kh337.jpg")
                .ignoreContentType(true)
                .method(Method.GET)
                .execute();
        //聲明緩衝字節輸入流
        BufferedInputStream bufferedInputStream = response.bodyStream();
        //緩衝字節輸出流-》文件字節輸出流-》文件
        File file = new File("D:\\img.png");
        FileOutputStream fileOutputStream = new FileOutputStream(file);
        BufferedOutputStream bufferedOutputStream = new BufferedOutputStream(fileOutputStream);
        //把緩衝字節輸入流寫入到輸出流
        byte[] b = new byte[1024]; //每次最多讀1KB的大小
        int length; //實際讀入的字節
        while ((length = bufferedInputStream.read(b))!=-1){
            //寫入到輸出流
            bufferedOutputStream.write(b,0,length);
        }
        //刷新緩衝的輸出流。這將強制將任何緩衝的輸出字節寫入底層輸出流。
        bufferedOutputStream.flush();
        bufferedInputStream.close();
    }
相關文章
相關標籤/搜索