java里面的三种下载方式

来源:互联网 发布:中国最大的数据平台 编辑:程序博客网 时间:2024/05/07 20:38

第一种:URL方式,这是一种最简单的,只是将下载途径加入到url对象里面,然后用inputstream流将其读出来,再使用fileoutputstream写入到相关的文件途径下面即可。主要代码如下:

URL url=new URL("https://www.duba.com/?f=einfo_liebao");
FileOutputStream fos=new FileOutputStream("D:\\android\\abc\\td.txt");
InputStream is=url.openStream();
int r;
byte []b=new byte[1024];
while((r=is.read(b))!=-1){
fos.write(b,0,r);

}
fos.close();
System.out.println("已经成功下载");


第二种:是一种基于URL方式封装起来的。它不像第一种方式那样只能添加途径到url对象里面,然后只能等到程序运行结束,其中不能添加任何条件。这个可以利用相关的方法了解到相关的错误码,可以决定下载进程,下载速度、多线程等。

package text4;


import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;


public class Download {


public static void main(String[] args) {
// TODO Auto-generated method stub
try {
URL url=new URL("http://sw.bos.baidu.com/sw-search-sp/software/30f44738c65/QQ_8.4.18357.0_setup.exe");
final HttpURLConnection conn=(HttpURLConnection)url.openConnection();
if(conn.getResponseCode()==200){
System.out.println(conn.getContentLengthLong());
final long length=conn.getContentLengthLong();
new Thread(new Runnable() {

@Override
public void run() {
try {
InputStream is=conn.getInputStream();
FileOutputStream fos=new FileOutputStream("D://android//abc//qq.exe");
final File file=new File("D://android//abc//qq.exe");
new Thread(new Runnable() {
public void run() {
while(true){

double len=file.length();
double c=len/length*100;
System.out.printf("已下载%.2f%%\n",c);
if(len==length){
System.out.println("下载成功");
break;
}
try {
Thread.sleep(500);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}

}
}
}).start();
byte[]b=new byte[1024*1024];
int len;
while((len=is.read(b))!=-1){
fos.write(b, 0, len);
}
fos.close();
is.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
for(int i=0;i<10;i++){
System.out.println("第"+(i+1)+"次打酱油");
try {
Thread.sleep(500);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}


}
}).start();
}

} catch (MalformedURLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}

}


}

第三种:是使用了okhttp jar包写的,这种写法思想是先将网上的东西下载下来存到内存里面,然后一次性写入你想下载的途径里。在文件比较小的时候,这个使用比较方便。但是在文件比较大的时候,一般建议使用第二种方法。减少内存占用


package text4;
import java.io.FileOutputStream;
import java.io.IOException;
import okhttp3.OkHttpClient;
import okhttp3.Request;
import okhttp3.Response;


public class Download1 {


public static void main(String[] args) {
// TODO Auto-generated method stub
//创建客户端,(可以看成是浏览器)
OkHttpClient client=new OkHttpClient();
Request request=new Request.Builder().url("http://d.ifengimg.com/mw978_mh598/p2.ifengimg.com/a/2016_26/ab7aa9d12669d60_size82_w434_h653.jpg").build();
try {
Response response=client.newCall(request).execute();
if(response.isSuccessful()){
FileOutputStream fos=new FileOutputStream("D://android//abc//mao.txt");
//response.body().bytes();//得到服务器响应内容的字节数组
fos.write(response.body().bytes());//如果资源大于1M的时候建议使用byteStream()得到流来处理
//先将资源写到内存里面,然后一次型写入文本里面
fos.close();
System.out.println("下载成功");
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}


}


0 0
原创粉丝点击