實(shí)現(xiàn)這個(gè)功能比較簡(jiǎn)單,用到的類有兩個(gè):ProgressMonitorInputStream(主要是整個(gè)類) 和 ProgressMonitor ,在javax.swing中整個(gè)文件的大小,和當(dāng)前已經(jīng)讀取文件的大小,獲得整個(gè)文件大小的方法
彌勒ssl適用于網(wǎng)站、小程序/APP、API接口等需要進(jìn)行數(shù)據(jù)傳輸應(yīng)用場(chǎng)景,ssl證書(shū)未來(lái)市場(chǎng)廣闊!成為創(chuàng)新互聯(lián)建站的ssl證書(shū)銷售渠道,可以享受市場(chǎng)價(jià)格4-6折優(yōu)惠!如果有意向歡迎電話聯(lián)系或者加微信:18980820575(備注:SSL證書(shū)合作)期待與您的合作!
代碼如下:
ProgressMonitorInputStream monitor;
/**
* @param 表示此進(jìn)度條要依附在哪個(gè)組件上
* @param 顯示在此進(jìn)度條上的消息
* @param 需要監(jiān)控的輸入流
*/
monitor = new ProgressMonitorInputStream(null, "Loading ",new FileInputStream("filename path"));
int all = monitor.available();//整個(gè)文件的大小
int in = monitor.read(data);//每次讀取文件的大小
例如:你每次讀一行str=in.readLine();則data=str.instr.getBytes()+1;這里+1,主要是為了獲得換行符的字節(jié)數(shù),否則,最后獲得的進(jìn)步無(wú)法達(dá)到100%
代碼如下:
int readed=0;//表示已經(jīng)讀取的文件
reader+=in;//累加讀取文件大小
計(jì)算進(jìn)度:
代碼如下:
float process = (float) readed / all * 100;// 算出百分比
窗口顯示:
代碼如下:
progressMonitor.setNote("archived " + process + " %");// 顯示在進(jìn)度條上
上述四種方法的比較: 1、開(kāi)發(fā)簡(jiǎn)單,由于要定時(shí)起一個(gè)HTTP 連接去獲得進(jìn)度信息,因此,發(fā)生的連接請(qǐng)求也增多 ,另外,在低速的情況下,常常會(huì)出各種各樣的BUG,網(wǎng)絡(luò)環(huán)境的差異,還造成那個(gè)周期很 難選擇。 2、開(kāi)發(fā)較復(fù)雜,COMET 本身需要服務(wù)器的支持,這樣TOMCAT 至少得選6.0,否則服務(wù)器長(zhǎng)連 接,壓力肯定受不了,但是,性能相對(duì)好一些,由于一次上傳實(shí)際上只啟動(dòng)了兩個(gè)HTTP 鏈接 請(qǐng)求,比起AJAX 來(lái)說(shuō),那是要少很多請(qǐng)求了。另外一個(gè)優(yōu)點(diǎn)是,COMET 將使得服務(wù)器可以主 動(dòng)將進(jìn)度情況匯報(bào)給客戶端,因此,客戶端的進(jìn)度條相對(duì)來(lái)說(shuō),要準(zhǔn)確一點(diǎn)。 3、目前看來(lái)解決方案最好的一個(gè)了,雖然開(kāi)發(fā)需要涉及到 FLASH、JAVASCRIPT、以及 JAVA 的 開(kāi)發(fā),但是代碼量都不是很多,因此,復(fù)雜程度相對(duì)屬于中等程度。但是FLASH 也有幾個(gè)問(wèn) 題:第一、瀏覽器 FLASH 版本兼容問(wèn)題,第二、FLASH 是通過(guò)獲得發(fā)送數(shù)據(jù)的進(jìn)度來(lái)體現(xiàn)進(jìn)度 條的,因此雖然不需要服務(wù)器端開(kāi)發(fā)進(jìn)度部分的代碼,但是進(jìn)度的展現(xiàn)有些不是很準(zhǔn)確,經(jīng) 常會(huì)有一開(kāi)始速度很快,但是后面越來(lái)越慢的情況。 4、就不說(shuō)了,開(kāi)發(fā)肯定是最麻煩的,但是進(jìn)度條效果肯定是最好的,但要給每種瀏覽器都 要搞個(gè)插件,還是比較痛苦的。 總結(jié)一下,希望對(duì)大家有幫助。 2 其實(shí)很麻煩的,之前試過(guò),會(huì)有下面幾個(gè)問(wèn)題: 第一、服務(wù)器端一定要選擇支持HTTP 長(zhǎng)連接的服務(wù)器,否則操作系統(tǒng)的線程限制,會(huì)導(dǎo)致并 發(fā)降低。 第二、除非原來(lái)就采用的是COMET 的進(jìn)度方式,否則,你要把周期獲得進(jìn)度的方式,改成 COMET 的方式,那很郁悶的,COMET 要服務(wù)器主動(dòng)把進(jìn)度信息用JAVASCRIPT 的方式發(fā)回客戶端 ,所以需要把結(jié)構(gòu)轉(zhuǎn)化為JAVASCRIPT 調(diào)用才行。 第三、對(duì)于不同的瀏覽器,處理 JAVASCRIPT 的方式是不一樣的,我試驗(yàn)的結(jié)果是,IE 會(huì)在收 到一定數(shù)量的JAVASCRIPT 之后才執(zhí)行,所以雖然我在服務(wù)器端每次都調(diào)用了flush 方法,但 是界面上還是需要等一段時(shí)間才能響應(yīng)。而這段時(shí)間又不好控制了,因?yàn)樯蟼魑募笮〉牟?一樣,導(dǎo)致了下發(fā)的JAVASCRIPT 數(shù)量也不一樣,所以基本很難達(dá)到FLASH 那樣的效果。 其實(shí)如果已經(jīng)決定采用flash 了,那就不需要再去修改服務(wù)器端的代碼了,因?yàn)槟莻€(gè)進(jìn)度信 息服務(wù)器發(fā)不發(fā)都不會(huì)影響到代碼的執(zhí)行,反正FLASH 本身已經(jīng)提供了進(jìn)度指示了,所以, 說(shuō)簡(jiǎn)單地,要改成FLASH 上傳,你直接做個(gè)FLASH 客戶端就好了,不需要再改服務(wù)器端了。 對(duì)了,還有一種情況需要改服務(wù)器端,那就是FLASH 上傳多個(gè)文件是采用多線程上傳的,因 此如果你一次上傳多個(gè)文件,那就需要改服務(wù)器端了。需要在所有線程上傳完成的情況下, 再去修改數(shù)據(jù)庫(kù)。
import?java.io.FileInputStream;
import?javax.swing.ProgressMonitor;
import?javax.swing.ProgressMonitorInputStream;
public?class?Example10_18
{
public?static?void?main?(?String[]?args?)
{
try
{
FileInputStream?input?=?new?FileInputStream?("Example10_18.java");
ProgressMonitorInputStream?in?=?new?ProgressMonitorInputStream?(null,?"讀取java文件",?input);
byte?b[]?=?new?byte[1024];
while?(?in.read?(b)?!=?-1)
{
String?s?=?new?String?(b);
System.out.print?(s);
Thread.sleep?(60);
}
in.close?();
}
catch?(Exception?e)
{
e.printStackTrace?();
}
}
}