HTTP w Javie czyli jak pobierać pliki z zasobów sieciowych korzystając z protokłu HTTP

Nie wdają się w zbędne dywagacje,  postanowiłem podzielić się niewielką klasą która wydatnie ułatwia tytułowe zadanie – czyli pobieranie plików udostępnianych za pomocą protokołu HTTP, np. stron www, dokumentów PDF, grafik, etc.

package jp.web;

import java.io.*;
import java.net.*;
import java.util.*;
import java.util.regex.*;

/** 
 * @author Jarek Przygódzki jarek.przygodzki@gmail.com
 */
public class HttpFile {

	int length, code;
	String type, encoding, msg;
	Map<String, List<String>> headers;
	byte[] data;
	InputStream errorStream = null;
	public final int READ_CHUNK_SIZE = 8192; // 8kB
	
	public HttpFile(URL url) throws IOException {
		HttpURLConnection conn = null;
		try {
			conn = (HttpURLConnection) url.openConnection();
		} catch (ClassCastException e) {
			throw new IllegalArgumentException("URL protocol must be HTTP.");
		}
		// Set up a request.
		conn.setConnectTimeout(10000);
		conn.setReadTimeout(10000);
		conn.setInstanceFollowRedirects(true);
		conn.setRequestProperty("User-agent", "Java Spider");

		try {
			conn.connect();

			code      = conn.getResponseCode();
			msg       = conn.getResponseMessage();
			headers  = conn.getHeaderFields();
			length    = conn.getContentLength();
			type      = conn.getContentType();
			encoding = conn.getContentEncoding();

			if (encoding == null) {
				Pattern p = Pattern.compile("(; )?charset=(.+)");
				Matcher m = p.matcher(type);
				if (m.find()) {
					encoding = m.group(2);
				}
			}
			InputStream stream = conn.getInputStream();
			errorStream   = conn.getErrorStream();
			data = new byte[Math.max(length, stream.available())];
			byte[] buffer = new byte[READ_CHUNK_SIZE];
			int total, n;
			total = n = stream.read(data);
			for (n = stream.read(buffer); n != -1; n = stream.read(buffer), total += n) {
				byte[] new_data = new byte[data.length + n];
				System.arraycopy(data, 0, new_data, 0, data.length);
				System.arraycopy(buffer, 0, new_data, data.length, n);
				data = new_data;
			}
		} finally {
			conn.disconnect();
		}
	}

	public String getEncoding() {
		return encoding;
	}

	public String getContentType() {
		return type;
	}

	public int getContentLength() {
		return length;
	}

	public int getResponseCode() {
		return code;
	}

	public Map<String, List<String>> getHeaderFields() {
		return headers;
	}

	public byte[] getData() {
		return data;
	}

	public InputStream getErrorStream() {
		return errorStream;
	}
}

I dla porządku kilka przykładów zastosowanie

  • Strona www
    HttpFile hf = new HttpFile(new URL("https://jarekprzygodzki.wordpress.com/"));
    String content = new String(hf.getData(), hf.getEncoding());
    
  • plik PDF
    		HttpFile hf = new HttpFile(
    				new URL("http://resources.autodesk.com/files/med/docs/ubisoft_assassin_s_creed_v3.pdf"));
    		File pdf = new File("Ubisoft Assassin’s Creed.pdf");
    		FileChannel ch = new FileOutputStream(pdf).getChannel();
    		ch.write(ByteBuffer.wrap(hf.getData()));
    		ch.close();
    

One thought on “HTTP w Javie czyli jak pobierać pliki z zasobów sieciowych korzystając z protokłu HTTP

Skomentuj

Wprowadź swoje dane lub kliknij jedną z tych ikon, aby się zalogować:

Logo WordPress.com

Komentujesz korzystając z konta WordPress.com. Log Out / Zmień )

Zdjęcie z Twittera

Komentujesz korzystając z konta Twitter. Log Out / Zmień )

Facebook photo

Komentujesz korzystając z konta Facebook. Log Out / Zmień )

Google+ photo

Komentujesz korzystając z konta Google+. Log Out / Zmień )

Connecting to %s