文件下载网络上下载资源,当文件比较小的时候,没有显示进度,可能看不出来什么,但当文件内容比较大,显示出进度条,这样就更加贴切的让用户感到文件下载的状况。
现在先做一个小例子,主要是现在控制台输出文件下载的进度。
package com.tgb.demo; import java.io.File; import java.io.IOException; import java.io.InputStream; import java.io.RandomAccessFile; import java.net.HttpURLConnection; import java.net.URL; /** * Created by zss on 2017/3/5. */ public class download { public static void dowanload(String url, String path) throws IOException { System.out.println("下载中..."); InputStream inputStream = null; RandomAccessFile randomAccessFile = null; try { HttpURLConnection urlConnection = (HttpURLConnection) new URL(url).openConnection(); urlConnection.setRequestMethod("GET"); urlConnection.setConnectTimeout(10 * 1000); File file = new File(path); //文件夹是否存在 if (!file.getParentFile().exists()) file.getParentFile().mkdir(); if (file.exists()) file.delete(); file.createNewFile(); int responseCode = urlConnection.getResponseCode(); if (responseCode >= 200 && responseCode < 300) { inputStream = urlConnection.getInputStream(); int len = 0; byte[] data = new byte[4096]; //用于保存当前进度(具体进度) int progres = 0; //获取文件长度 int maxProgres = urlConnection.getContentLength(); randomAccessFile = new RandomAccessFile(file, "rwd"); //设置文件大小 randomAccessFile.setLength(maxProgres); //将文件大小分成100分,每一分的大小为unit int unit = maxProgres / 100; //用于保存当前进度(1~100%) int unitProgress = 0; while (-1 != (len = inputStream.read(data))) { randomAccessFile.write(data, 0, len); progres += len;//保存当前具体进度 int temp = progres / unit; //计算当前百分比进度 if (temp >= 1 && temp > unitProgress) {//如果下载过程出现百分比变化 unitProgress = temp;//保存当前百分比 System.out.println("正在下载中..." + unitProgress + "%"); } } inputStream.close(); System.out.println("下载完成..."); } else { System.out.println("服务器异常..."); } } finally { if (null != inputStream) { inputStream.close(); } if (null != randomAccessFile) { randomAccessFile.close(); } } } public static void main(String[] args) throws IOException { String path = "D:\\abc\\image.jpg"; String url="http://www.dowei.com/d/file/tuku/meinv/2016-01-26/1453788622507000.jpg"; dowanload(url, path); } }
下面是显示的效果:
如果想把这个效果做到前端,还需要前台js的控制,这个最近正在研究,应该会很简单,做好之后再添加到这篇博客中,咱们共同分享。