java版文件下载的核心部分

主要代码
1.下载文件的大小.
2.当前已经下载的大小(就能得到下载百分比)
3.得到下载的速度..

import java.io.BufferedInputStream;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.net.HttpURLConnection;
import java.net.URL;
import java.text.DecimalFormat;

public class test implements Runnable {
private static final boolean DEBUG = false;

static int sudu = 0;

static boolean fo = true;

public void m() {
String url = "http://www.feifeishijie.com/d/file/p/0037aec039e87cbb95767c7224bc5e8f.rar"; // 下载文件地址
String file = "c:/1.rar"; // 保存地址
try {
saveToFile(url, file);
} catch (IOException e) {
e.printStackTrace();
}
}

public static void main(String[] args) {
try {
test t = new test();
Thread tt = new Thread(t);
tt.start();
t.m();
} catch (Exception e) {
e.printStackTrace();
}
}

public static void saveToFile(String destUrl, String fileName)
throws IOException {
boolean DEBUG = true;// 是否输出调试信息
int BUFFER_SIZE = 10240;// 缓冲区大小
long zong = 0;
DecimalFormat twoDigits = new DecimalFormat("0.00");

FileOutputStream fos = null;
BufferedInputStream bis = null;
HttpURLConnection httpUrl = null;
URL url = null;
byte[] buf = new byte[BUFFER_SIZE];
int size = 0;

// 建立链接
url = new URL(destUrl);
httpUrl = (HttpURLConnection) url.openConnection();
// 连接指定的资源
long count = Long.parseLong(httpUrl.getHeaderField("Content-Length")); // 获取要下载文件的总大小(字节)
httpUrl.connect();
// 获取网络输入流
bis = new BufferedInputStream(httpUrl.getInputStream());
// 建立文件
File file = new File(fileName);
if (!file.exists()) {
if (!file.getParentFile().exists()) {
file.getParentFile().mkdirs();
}
file.createNewFile();
}
fos = new FileOutputStream(fileName);

if (DEBUG)
System.out.println("正在获取链接[" + destUrl + "]的内容...\n将其保存为文件["
+ fileName + "]");

// 保存文件
while ((size = bis.read(buf)) != -1) {
fos.write(buf, 0, size);
zong += size; // size是循环一次下载的字节数.所以.我们每次相加.得到zong 就知道当前下载了多少字节了
// .方便等下算文件下载的百分比
sudu += size; // 因为我们下面的线程会3秒钟自动读取一次sudu的值.
// 这样我们好知道1秒下载了多少.好算出来下载的速度..
// ---------------------看不到下载的速度.因为此线程输出速度太快.屏蔽下面的输出.---------------------
System.out.println("size=" + size + "-----zong=" + zong);
System.out.println("进度"
+ (twoDigits.format((double) (zong * 100) / count)));
}
fo = false;
fos.close();
bis.close();
httpUrl.disconnect();
}

public void run() {
while (fo) {
System.out.println("sudu=" + sudu + " 下载速度" + ((sudu / 1024) / 3)); // 我设置3秒算一次.这样会准确点.等到的是KB
sudu = 0;
try {
Thread.sleep(3000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
java核心知识点整理 1.Java中没有多继承,而是用接口来代替多继承 2.运行一个已经编译的程序时,Java解释器总是从指定类的main方法中的代码开始执行,因此,执行代码中必须有一个main函数。 3.Java是典型的强类型语言,即必须声明变量的类型,Java中有8种类型,6种数值类型(4个整数型和2个浮点型)、一个字符类型和一个boolean类型。 想学习java可以来这个群,首先是二二零,中间是一四二,最后是九零六,里面有大量的学习资料可以下载。 4.强制类型转换: int nx = (int) x; // (语法:用圆括号将目标类型括起来,后面跟上要转换的变量); 5.Java不能为单独的方法,如main方法,定义局部常量,而只能为类定义常量,供该类的所有方法使用,所以,通常称之为类常量。如: class UsersConstants{ 2public static final double g = 32; public static final double main(String[] args){ System.out.println(g); } } 注意:常量定义于main方法的外边,而且必须有关键字 static final; 6.字符串的子串: String str = hello”“; String str1 = str.substring(0,4); //输出hell 7.不要用==运算符来测试两个字符串是否相等,该运算符只能判断两个字符串是否存在同一个位置。 用equals. String str = “hello”; str.equals(”hell”); // return false; 8.对象的行为、状态、标识 9.面向过程与OOP
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值