请问一个java的文件下载的问题,为什么我的下载每次都看不到进度条,而是一下子就下好了呢?
我是用流的方式写的下载,部分代码如下:bis=newBufferedInputStream(newFileInputStream(file));bos=newBuffer...
我是用流的方式写的下载,部分代码如下:
bis = new BufferedInputStream(new FileInputStream(file));
bos = new BufferedOutputStream(response.getOutputStream());
byte[] buffer = new byte[4096];
while (-1 != (n = bis.read(buffer))) {
bos.write(buffer, 0, n);
bos.flush();
}
为什么这段代码执行的时候,总是看不到平常下载的进度条,而是每次都一下就下好了。而且碰到大文件的时候,那个保存框也要等很久才会跳出来,感觉就是文件在后台下载完了才跳出对话框,让我保存。请问有什么办法能让这个下载达到平常http下载时候一样一点一点的下载呢?
我说的只是小文件很快,但是遇到大文件就会等很久才会弹出保存的对话框,这个时候用户会不知道发生什么事了,这样的用户体验可不好 展开
bis = new BufferedInputStream(new FileInputStream(file));
bos = new BufferedOutputStream(response.getOutputStream());
byte[] buffer = new byte[4096];
while (-1 != (n = bis.read(buffer))) {
bos.write(buffer, 0, n);
bos.flush();
}
为什么这段代码执行的时候,总是看不到平常下载的进度条,而是每次都一下就下好了。而且碰到大文件的时候,那个保存框也要等很久才会跳出来,感觉就是文件在后台下载完了才跳出对话框,让我保存。请问有什么办法能让这个下载达到平常http下载时候一样一点一点的下载呢?
我说的只是小文件很快,但是遇到大文件就会等很久才会弹出保存的对话框,这个时候用户会不知道发生什么事了,这样的用户体验可不好 展开
3个回答
2011-06-13
展开全部
建立新的线程来处理下载。去看Thread的API有详细说明。例如本来是:
downloading();
System.out.println("下载完成");
就改成:
class DownloadListener {//这个class自己找个地方放。
public void downloadInProgress(double percent) {
System.out.println("已下载" + percent);
}
public void downloadCompleted() {
System.out.println("已下载完成");
}
}
//从这里开始应该被改成的内容
DownloadListener downloadListener = new DownloadListener();
new Thread() {
public void run() { //这里写第二线程的内容
downloading(downloadListener);//于是downloadListener被传入了downloading函数,就可以在downloading函数内部通过呼叫downloadListener的downloadInProgress和downloadCompleted来通知第一线程下载情况。
}
}.start(); //第一线程会在这里启动第二线程,然后不管第二线程执行了什么是否完成,直接执行下一句。
System.out.println("第二线程已经启动");
//例子里很多System.out.println是为了简明。实际情况一般是修改一个给用户看的状态栏JLabel,这里下载进行中时,应该是更新一个JProgressBar。
downloading();
System.out.println("下载完成");
就改成:
class DownloadListener {//这个class自己找个地方放。
public void downloadInProgress(double percent) {
System.out.println("已下载" + percent);
}
public void downloadCompleted() {
System.out.println("已下载完成");
}
}
//从这里开始应该被改成的内容
DownloadListener downloadListener = new DownloadListener();
new Thread() {
public void run() { //这里写第二线程的内容
downloading(downloadListener);//于是downloadListener被传入了downloading函数,就可以在downloading函数内部通过呼叫downloadListener的downloadInProgress和downloadCompleted来通知第一线程下载情况。
}
}.start(); //第一线程会在这里启动第二线程,然后不管第二线程执行了什么是否完成,直接执行下一句。
System.out.println("第二线程已经启动");
//例子里很多System.out.println是为了简明。实际情况一般是修改一个给用户看的状态栏JLabel,这里下载进行中时,应该是更新一个JProgressBar。
本回答被提问者和网友采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
快了还不好,多此一举
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
你的网速快,下载的文件小,没办法
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询