import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.net.MalformedURLException; import java.net.URL; import java.net.URLConnection; public class GetURL { private int mTotalLength; private int mCurrentLength; URL mURL; URLConnection mURLConnection; public GetURL(String strURL) { try { mURL = new URL(strURL); mURLConnection = mURL.openConnection(); } catch (Exception e) { e.printStackTrace(); } } public int getTotalLen() { return mTotalLength; } public int getCurrentLen() { return mCurrentLength;} private void initURLConnection() { mTotalLength = mURLConnection.getContentLength(); mCurrentLength = 0; } private void addCurrentLen(int len) { mCurrentLength += len; } public InputStream getInputStream() { InputStream in; try { in = mURLConnection.getInputStream(); } catch (IOException e) { e.printStackTrace(); return null; } return in; } public static void main(String[] args) { if (args.length != 1) { System.err.println("argument count error"); return; } GetURL url = new GetURL(args[0]); Runnable downloadThread = new Download(url); byte[] buffer = new byte[4096]; url.initURLConnection(); new Thread(downloadThread).start(); try { while (true) { InputStream in = url.getInputStream(); int count = in.read(buffer); if (count < 0) break; url.addCurrentLen(count); String strDebug = new String(buffer, 0, count); System.out.print(strDebug); String status = ((Download)downloadThread).getStatus(); if (status.equals("OK")) { break; } } } catch (Exception e) { e.printStackTrace(); } } } class Download implements Runnable { GetURL url; String status; public Download(GetURL url) { this.url = url; status = "RUNNING"; } public void run() { int total = url.getTotalLen(); try { while (true) { int current = url.getCurrentLen(); System.out.print("\r" + current + "/" + total); Thread.sleep(500); if (current >= total) { status = "OK"; break; } } // ~while System.out.println(); } catch (InterruptedException e) { e.printStackTrace(); } } public String getStatus() { return status; } }