您的位置:首页 > 理论基础 > 计算机网络

根据url从网络上下载资源

2017-12-02 13:52 246 查看
第一种写法:


package com.ifp.business.test;

import java.io.ByteArrayOutputStream;

import java.io.File;

import java.io.FileOutputStream;

import java.io.IOException;

import java.io.InputStream;

import java.net.HttpURLConnection;

import java.net.URL;



public class TestMethod {


/**

* 从网络Url中下载文件

*

*@param urlStr

*@param fileName

*@param savePath

*@throws IOException

*/

public static void downLoadFromUrl(String urlStr, String fileName,

String savePath) throws IOException {

System.out.println(urlStr);

URL url = new URL(urlStr);

HttpURLConnection conn = (HttpURLConnection) url.openConnection();

// 设置超时间为3秒

conn.setConnectTimeout(3 * 1000);

// 防止屏蔽程序抓取而返回403错误

conn.setRequestProperty("User-Agent",

"Mozilla/4.0 (compatible; MSIE 5.0; Windows NT; DigExt)");

// 设定请求的方法,默认是GET 这里不能使用post提交

conn.setRequestMethod("GET");

// 设置字符编码

conn.setRequestProperty("Charset", "UTF-8");


// 打开到此 URL 引用的资源的通信链接(如果尚未建立这样的连接)。

conn.connect();

// 文件大小

int fileLength = conn.getContentLength();

// 得到输入流

InputStream inputStream = conn.getInputStream();

// 获取自己数组

byte[] getData = readInputStream(inputStream, fileLength);


// 文件保存位置

File saveDir = new File(savePath);

if (!saveDir.exists()) {

saveDir.mkdir();

}

File file = new File(saveDir + File.separator + fileName);

FileOutputStream fos = new FileOutputStream(file);

fos.write(getData);

if (fos != null) {

fos.close();

}

if (inputStream != null) {

inputStream.close();

}


System.out.println("info:" + url + " download success");


}


/**

*从输入流中获取字节数组

*

*@param inputStream

*@return

*@throws IOException

*/

public static byte[] readInputStream(InputStream inputStream, int fileLength)

throws IOException {

byte[] buffer = new byte[1024];

int len = 0;

int size = 0;

ByteArrayOutputStream bos = new ByteArrayOutputStream();

while ((len = inputStream.read(buffer)) != -1) {

size += len;

bos.write(buffer, 0, len);

//打印下载的百分比

System.out

.println("下载了-------> " + size * 100 / fileLength + "%\n");

}

bos.close();

return bos.toByteArray();

}


public static void main(String[] args) {

try {

downLoadFromUrl(

"http://imgbbs.heiguang.net/forum/201510/06/104432cjc7c8tx7xxqqkgq.jpg",

"百度.jpg", "d:/111111/");

} catch (Exception e) {

e.printStackTrace();

}

}


}



第二种写法:

package test.downFile;

import java.io.BufferedInputStream;

import java.io.File;

import java.io.FileOutputStream;

import java.io.IOException;

import java.io.OutputStream;

import java.net.HttpURLConnection;

import java.net.MalformedURLException;

import java.net.URL;

import java.net.URLConnection;

import java.net.URLEncoder;


//测试下载的类

public class DownFile {


public static void main(String[] args) {

downloadFile(

"http://imgbbs.heiguang.net/forum/201510/06/104432cjc7c8tx7xxqqkgq.jpg",

"d:/111111/");


}


/**

*Java原生的API可用于发送HTTP请求,即java.net.URL、java.net.URLConnection,这些API很好用、很常用,

*但不够简便;

*

*1.通过统一资源定位器(java.net.URL)获取连接器(java.net.URLConnection) 2.设置请求的参数 3.发送请求

*4.以输入流的形式获取返回内容 5.关闭输入流

*

*/


/**

*

*@param urlPath

*           下载路径

*@param downloadDir

*           下载存放目录

*@return 返回下载文件

*/

public static File downloadFile(String urlPath, String downloadDir) {

File file = null;

try {

// 统一资源

URL url = new URL(urlPath);

// 连接类的父类,抽象类

URLConnection urlConnection = url.openConnection();

    // 设置超时间为3秒

urlConnection.setConnectTimeout(3 * 1000);

    // 防止屏蔽程序抓取而返回403错误

urlConnection.setRequestProperty("User-Agent",

    "Mozilla/4.0 (compatible; MSIE 5.0; Windows NT; DigExt)");

// http的连接类

HttpURLConnection httpURLConnection = (HttpURLConnection) urlConnection;

// 设定请求的方法,默认是GET

httpURLConnection.setRequestMethod("GET");

    // 设置字符编码

httpURLConnection.setRequestProperty("Charset", "UTF-8");


    // 打开到此 URL 引用的资源的通信链接(如果尚未建立这样的连接)。

httpURLConnection.connect();


    // 文件大小

int fileLength = httpURLConnection.getContentLength();


// 文件名

String filePathUrl = httpURLConnection.getURL().getFile();

String fileFullName = filePathUrl.substring(filePathUrl

.lastIndexOf(File.separatorChar) + 1);


System.out.println("file length---->" + fileLength);


URLConnection con = url.openConnection();


BufferedInputStream bin = new BufferedInputStream(

httpURLConnection.getInputStream());


String path = downloadDir + File.separatorChar + fileFullName;

file = new File(path);

if (!file.getParentFile().exists()) {

file.getParentFile().mkdirs();

}

OutputStream out = new FileOutputStream(file);

    int size = 0;

    int len = 0;

byte[] buf = new byte[1024];

while ((size = bin.read(buf)) != -1) {

len += size;

out.write(buf, 0, size);

// 打印下载百分比

    System.out.println("下载了-------> " + len * 100 / fileLength

+ "%\n");

}

bin.close();

out.close();

} catch (MalformedURLException e) {

// TODO Auto-generated catch block

e.printStackTrace();

} catch (IOException e) {

// TODO Auto-generated catch block

e.printStackTrace();

} finally {

return file;

}


}


}


这俩种方法其实差不多。第一种融合了第二种写法。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: