java下載網絡文件的N種方式

通過java api下載網絡文件的方法有很多,在這裏我做個彙總,主要方式有以下幾種:

1、使用 common-io庫下載文件,需要引入commons-io-2.6.jar

public static void downloadByCommonIO(String url, String saveDir, String fileName) {
        try {
            FileUtils.copyURLToFile(new URL(url), new File(saveDir, fileName));
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

2、使用NIO下載文件,需要 jdk 1.4+

public static void downloadByNIO(String url, String saveDir, String fileName) {
        ReadableByteChannel  rbc = null;
        FileOutputStream fos = null;
        FileChannel foutc = null;
        try {
            rbc = Channels.newChannel(new URL(url).openStream());
            File file = new File(saveDir, fileName);
            file.getParentFile().mkdirs();
            fos = new FileOutputStream(file);
            foutc = fos.getChannel();
            foutc.transferFrom(rbc, 0, Long.MAX_VALUE);
           
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            if (rbc != null) {
                try {
                    rbc.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
            if (foutc != null) {
                try {
                    foutc.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
       
    }

3、使用NIO下載文件,需要 jdk 1.7+

public static void downloadByNIO2(String url, String saveDir, String fileName) {
        try (InputStream ins = new URL(url).openStream()) {
            Path target = Paths.get(saveDir, fileName);
            Files.createDirectories(target.getParent());
            Files.copy(ins, target, StandardCopyOption.REPLACE_EXISTING);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

4、使用傳統io stream下載文件

public static void downloadByIO(String url, String saveDir, String fileName) {
		BufferedOutputStream bos = null;
		InputStream is = null;
		try {
			byte[] buff = new byte[8192];
			is = new URL(url).openStream();
			File file = new File(saveDir, fileName);
			file.getParentFile().mkdirs();
			bos = new BufferedOutputStream(new FileOutputStream(file));
			int count = 0;
			while ((count = is.read(buff)) != -1) {
				bos.write(buff, 0, count);
			}
		} catch (IOException e) {
			e.printStackTrace();
		} finally {
			if (is != null) {
				try {
					is.close();
				} catch (IOException e) {
					e.printStackTrace();
				}
			}
			if (bos != null) {
				try {
					bos.close();
				} catch (IOException e) {
					e.printStackTrace();
				}
			}
		}
	}

5、使用Byte Array獲得stream下載文件

public static void  downLoadFromUrl(String urlStr,String fileName,String savePath) throws IOException{
        URL url = new URL(urlStr); 
        HttpURLConnection conn = (HttpURLConnection)url.openConnection();  
        //設置超時間爲5秒
        conn.setConnectTimeout(5*1000);
        //防止屏蔽程序抓取而返回403錯誤
        conn.setRequestProperty("User-Agent", "Mozilla/4.0 (compatible; MSIE 5.0; Windows NT; DigExt)");

        //得到輸入流
        InputStream input = conn.getInputStream();  
        //獲取自己數組
        byte[] getData = readInputStream(input);    

        //文件保存位置
        File saveDir = new File(savePath);
        if(!saveDir.exists()){
            saveDir.mkdir();
        }
        File file = new File(saveDir+File.separator+fileName);    
        FileOutputStream output = new FileOutputStream(file);     
        output.write(getData); 
        if(output!=null){
        	output.close();  
        }
        if(input!=null){
            input.close();
        }
        System.out.println("download success!!");
    }

    public static  byte[] readInputStream(InputStream inputStream) throws IOException {  
        byte[] buffer = new byte[10240];  
        int len = 0;  
        ByteArrayOutputStream bos = new ByteArrayOutputStream();  
        while((len = inputStream.read(buffer)) != -1) {  
            bos.write(buffer, 0, len);  
        }  
        bos.close();  
        return bos.toByteArray();  
    }

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章