import java.io.File;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.net.URL;
import java.net.URLConnection;
import java.util.Date;
/**
* @author jjy @136336790@qq.com
*/
public class SaveFileUtil {
/** 保存的文件 */
private File file;
/** 保存的文件本地全路径 */
private String filepath;
/** 保存文件的本地名字 */
private String filename;
/** 网络文件的大小(单位:字节) */
private int fileLength;
private URLConnection uc;
private InputStream is;
private Thread thread;
/** 下载开始 和 结束 时间 */
private long startTime;
private long endTime;
public static void main(String[] args) {
final SaveFileUtil fileUtil = new SaveFileUtil("http://www.dm991.com/UUAuth2/2009-4/140348882920.jpg", "d:/");
System.out.println("保存后文件的全路径:" + fileUtil.getFilepath());
// 放一个线程来记录每秒下载的信息
Thread thread = new Thread() {
public void run() {
while (true) {
try {
sleep(1000);
} catch (Exception e) {
}
System.out.println("下载了: " + Math.round(fileUtil.getSavingPro() * 100) + "%");
if (fileUtil.isSaveOk()) {
System.out.println("下载时间为:" + fileUtil.getSaveTime() + "毫秒");
System.out.println("下载该文件的平均速度为:" + fileUtil.getDownSpeed() + "kb/s");
return;
}
}
}
};
thread.start();
}
/**
* @param url 要下载文件的url
* @param fileDir 要保存文件的路径
* @param fileName 文件要保存本地的名字 不需要后缀
*/
public SaveFileUtil(final String url, final String fileDir, String fileName){
init(url, fileDir, fileName);
}
/**
* @param url 要下载文件的url
* @param fileDir 要保存文件的路径
*/
public SaveFileUtil(final String url, final String fileDir){
init(url, fileDir, null);
}
private void init(final String url, final String fileDir, String fileName){
try {
// 初始化必要的数据
startTime = new Date().getTime();
URL urll = new URL(url);
uc = urll.openConnection();
if(fileName == null){
// 如果没有给文件保存本地的名字,默认使用url作为名字
fileName = url.replaceAll("[//:*?|\"]+", "");
filepath = fileDir + fileName;
}else{
String houzhui = url.substring(url.lastIndexOf("."), url.length());
filepath = fileDir + fileName + houzhui;
}
filename = fileName;
file = new File(filepath);
fileLength = uc.getContentLength();
} catch (Exception e) {
e.printStackTrace();
return;
}
// 放一个线程来保存文件
thread = new Thread() {
public void run() {
try {
try {
is = uc.getInputStream();
FileOutputStream out = new FileOutputStream(file);
int i = 0;
while ((i = is.read()) != -1) {
out.write(i);
}
endTime = new Date().getTime();
} finally{
if(is != null){
is.close();
}
}
} catch (Exception e) {
e.printStackTrace();
}
}
};
thread.start();
}
/**
* 获得网络文件的大小(单位:字节)
* @return
*/
public int getFileLength(){
return fileLength;
}
/**
* 获得保存的文件本地全路径
* @return
*/
public String getFilepath(){
return filepath;
}
/**
* 获得下载的时间 单位 毫秒
* @return
*/
public long getSaveTime(){
try {
thread.join();
return endTime - startTime;
} catch (InterruptedException e) {
e.printStackTrace();
return -1;
}
}
/**
* 获得保存的文件
* @return
*/
public File getFile(){
try {
thread.join();
return file;
} catch (InterruptedException e) {
e.printStackTrace();
return null;
}
}
/**
* 获得文件是否下载完毕
* @return
*/
public boolean isSaveOk(){
return !thread.isAlive();
}
/**
* 获得文件下载的进度 1表示下载完成
* @return
*/
public double getSavingPro(){
if(file.exists()){
long tt = file.length();
return tt/(fileLength * 1.00);
}else{
return -1;
}
}
/**
* 获得平均网速
* @return
*/
public static double getNormalDownSpeed(){
String zip360 = "http://down.360safe.com/360zip_beta.exe";
SaveFileUtil fileUtil = new SaveFileUtil(zip360,"D:/");
long time = fileUtil.getSaveTime();
fileUtil.file = null;
//TODO 待解决: 此处文件无法删除。
File file = new File(fileUtil.getFilepath());
file.delete();
return fileUtil.getFileLength()/time;
}
/**
* 获得平均下载速度 单位 kb/s
* @return
*/
public double getDownSpeed(){
return getFileLength()/getSaveTime();
}
/**
* 获得下载文件的名字
* @return
*/
public String getFilename() {
return filename;
}
}