import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.URL;
public class URLDownFileUtils {
    //测试
    public static void main(String[] args) throws Exception {
          saveUrlAs("http://www.xinhuanet.com/video/titlepic/121022/1210224056_1564625224346_title0h.jpg", "d:/123","1210224056_1564625224346_title0h.jpg", 3096); 
    }
    private static int timeOutVal=0;
    static{
    // 读取超时配置文件
        PropertiesUtil pro=new PropertiesUtil("timeOut.properties");
        timeOutVal=Integer.parseInt(pro.readProperty("timeOut"));
    }
    /**
     * 使用 java根据 url 直接下载文件
     * @param url  文件的url 地址
     * @param basePath 保存文件的 本地地址
     * @param filename 文件名称
     * @param inputStreamNum 文件传输时的最大字节流
     * @throws Exception
     */
    public static boolean saveUrlAs(String url,String basePath,String filename,int inputStreamNum) throws Exception{  
         //  
         File file=new File(basePath);  
         //判断文件夹是否存在  
         if (!file.exists())  
        {  
            //如果文件夹不存在,则创建新的的文件夹  
             file.mkdirs();  
        }  
         FileOutputStream fileOut = null;  
         HttpURLConnection conn = null;  
         InputStream inputStream = null;  
         try  
        {  
             // 建立链接  
             URL httpUrl=new URL(url);  
             conn=(HttpURLConnection) httpUrl.openConnection(); 
             //十分钟超时设置
             conn.setConnectTimeout(timeOutVal);  
             conn.setReadTimeout(timeOutVal); 
        // 处理图片下载 403 问题
             conn.setRequestProperty("User-Agent", "Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.86 Safari/537.36");
             conn.setRequestMethod("GET");  
             conn.setDoInput(true);    
             conn.setDoOutput(true);  
             // post方式不能使用缓存   
             conn.setUseCaches(false);  
             //连接指定的资源   
             conn.connect();  
             //获取网络输入流  
             inputStream=conn.getInputStream();  
             BufferedInputStream bis = new BufferedInputStream(inputStream);  
             //判断文件的保存路径后面是否以/结尾  
             if (!basePath.endsWith("/")) { 
                 basePath += "/";  
                 }  
             //写入到文件(注意文件保存路径的后面一定要加上文件的名称)  
             fileOut = new FileOutputStream(basePath+filename);  
             BufferedOutputStream bos = new BufferedOutputStream(fileOut);
             byte[] buf = new byte[inputStreamNum];  
             int length = bis.read(buf);  
             //保存文件  
             while(length != -1)  
             {  
                 bos.write(buf, 0, length);  
                 length = bis.read(buf);  
             }  
             bos.close();  
             bis.close();  
             conn.disconnect();  
             
             return true;
        } catch (Exception e)  
        {  
            e.printStackTrace();
           return false;
        }  
     } 
}