[英]How to get progress of downloading a file with audioinputstream java
我是剛開始使用Java下載文件,但是如果問題很愚蠢,請問對不起,但是我搜索了2天,卻找不到解決方案。 我在applet中使用JPanel,我想在progressBar中顯示下載進度。(也許下載不是正確的單詞,它更有可能是初始化)
我要顯示的是從URL下載wav文件的過程。我並不是要顯示讀取過程(我會讓用戶知道文件正在稍后處理。)我只是想了解進度ais = AudioSystem.getAudioInputStream(url);
我試圖使用ProgressMonitorInputStream,但這對我不起作用,因為我想將進度條添加到我的JFrame中。 我一直在尋找swingWorker,但是它的使用並沒有給我我想要的進步。
這是我的閱讀功能。 我還根據需要更改了wav格式。
public void readFile() {
byte[] data = null;
AudioInputStream ais = null;
try {
URL url = new URL("http://www-mmsp.ece.mcgill.ca/documents/AudioFormats/WAVE/Samples/AFsp/M1F1-Alaw-AFsp.wav");
ais = AudioSystem.getAudioInputStream(url);
AudioFormat format = ais.getFormat();
numberOfChannels = format.getChannels();
AudioFormat TargetFormat = new AudioFormat(format.getSampleRate(), 16, numberOfChannels, true, false);
AudioInputStream desiredFormatStream = AudioSystem.getAudioInputStream(TargetFormat,ais);
data = new byte[4];
int totalSampleCount = ais.available()/(format.getSampleSizeInBits()/8);
audio = new double[totalSampleCount];
for (int i = 0; i < totalSampleCount-1; i=i+2) {
desiredFormatStream.read(data);
if(!TargetFormat.isBigEndian()){
audio[i] = ((short) (((data[1] & 0xFF) << 8) + (data[0] & 0xFF))) / ((double) MAX_16_BIT);
audio[i+1] = ((short) (((data[3] & 0xFF) << 8) + (data[2] & 0xFF))) / ((double) MAX_16_BIT);
}
else {
audio[i] = ((short) (((data[0] & 0xFF) << 8) + (data[1] & 0xFF))) / ((double) MAX_16_BIT);
audio[i+1] = ((short) (((data[2] & 0xFF) << 8) + (data[3] & 0xFF))) / ((double) MAX_16_BIT);
}
}
StdAudio.open(TargetFormat);
} catch (Exception e) {
System.out.println(e.getMessage());
throw new RuntimeException("Could not read " + filename);
}
}
有什么辦法可以做到這一點?
提前致謝。
最簡單的方法是在您已經存在的URL
上打開URLConnection
並查詢Content-Length
http-header字段。 使用getContentLength()
方法進行操作。
注意如果要下載大文件,則
int
可能不足以容納內容長度。 因此,應首選getContentLengthLong()
。 從Java 7開始可以使用此方法。
這將保存文件的長度(以字節為單位)。 當您通過AudioInputStream.read()
讀取時,此方法將返回每次讀取的實際字節數。
偽碼
long totalLength = con.getContentLengthLong();
while still reading{
long totalBytesRead += in.read();
print "Process: "+(totalBytesRead * 100 / totalLength);
}
另請參閱 :
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.