java http 下载_Java 通过 HTTP 下载文件

1. [代码]Download.java

package core.spider;

import java.io.*;

import java.net.*;

import java.util.*;

// This class downloads a file from a URL.

class Download extends Observable implements Runnable {

// Max size of download buffer.

private static final int MAX_BUFFER_SIZE = 1024;

// These are the status names.

public static final String STATUSES[] = {"Downloading",

"Paused", "Complete", "Cancelled", "Error"};

// These are the status codes.

public static final int DOWNLOADING = 0;

public static final int PAUSED = 1;

public static final int COMPLETE = 2;

public static final int CANCELLED = 3;

public static final int ERROR = 4;

private URL url; // download URL

private int size; // size of download in bytes

private int downloaded; // number of bytes downloaded

private int status; // current status of download

// Constructor for Download.

public Download(URL url) {

this.url = url;

size = -1;

downloaded = 0;

status = DOWNLOADING;

// Begin the download.

download();

}

// Get this download's URL.

public String getUrl() {

return url.toString();

}

// Get this download's size.

public int getSize() {

return size;

}

// Get this download's progress.

public float getProgress() {

return ((float) downloaded / size) * 100;

}

// Get this download's status.

public int getStatus() {

return status;

}

// Pause this download.

public void pause() {

status = PAUSED;

stateChanged();

}

// Resume this download.

public void resume() {

status = DOWNLOADING;

stateChanged();

download();

}

// Cancel this download.

public void cancel() {

status = CANCELLED;

stateChanged();

}

// Mark this download as having an error.

private void error() {

status = ERROR;

stateChanged();

}

// Start or resume downloading.

private void download() {

Thread thread = new Thread(this);

thread.start();

}

// Get file name portion of URL.

private String getFileName(URL url) {

String fileName = url.getFile();

return fileName.substring(fileName.lastIndexOf('/') + 1);

}

// Download file.

public void run() {

RandomAccessFile file = null;

InputStream stream = null;

try {

// Open connection to URL.

HttpURLConnection connection =

(HttpURLConnection) url.openConnection();

// Specify what portion of file to download.

connection.setRequestProperty("Range",

"bytes=" + downloaded + "-");

// Connect to server.

connection.connect();

// Make sure response code is in the 200 range.

if (connection.getResponseCode() / 100 != 2) {

error();

}

// Check for valid content length.

int contentLength = connection.getContentLength();

if (contentLength < 1) {

error();

}

// Set the size for this download if it hasn't been already set.

if (size == -1) {flash插件

size = contentLength;

stateChanged();

}

// Open file and seek to the end of it.

file = new RandomAccessFile(getFileName(url), "rw");

file.seek(downloaded);

stream = connection.getInputStream();

while (status == DOWNLOADING) {

// Size buffer according to how much of the file is left to download.

byte buffer[];

if (size - downloaded > MAX_BUFFER_SIZE) {

buffer = new byte[MAX_BUFFER_SIZE];

} else {http://www.huiyi8.com/flashchajian/player/

buffer = new byte[size - downloaded];

}

// Read from server into buffer.

int read = stream.read(buffer);

if (read == -1)

break;

// Write buffer to file.

file.write(buffer, 0, read);

downloaded += read;

stateChanged();

}

// Change status to complete if this point was reached because downloading has finished.

if (status == DOWNLOADING) {

status = COMPLETE;

stateChanged();

}

} catch (Exception e) {

error();

} finally {

// Close file.

if (file != null) {

try {

file.close();

} catch (Exception e) {}

}

// Close connection to server.

if (stream != null) {

try {

stream.close();

} catch (Exception e) {}

}

}

}

// Notify observers that this download's status has changed.

private void stateChanged() {

setChanged();

notifyObservers();

}

public static void main(String args[]){

try {

Download d = new Download(new URL("http://www.oschina.net/img/logo.gif"));

d.run();

} catch (MalformedURLException e) {

// TODO Auto-generated catch block

e.printStackTrace();

}

}

}

阅读(311) | 评论(0) | 转发(0) |

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值