如何获取使用audioinputstream java下载文件的进度
我刚开始用java下载文件,如果这是一个愚蠢的问题,我很抱歉,但我已经搜索了2天,没有找到解决方案。我在applet中使用JPanel,我想在progressBar中显示下载进度。(可能下载不是正确的词,更可能是初始化)
我想展示的是从URL下载wav文件的过程。我并不想显示读取过程(稍后我会让用户知道文件正在处理中)我只想了解一下ais=音响系统的进展情况。getAudioInputStream(url)
我尝试使用ProgressMonitorInputStream,但这对我不起作用,因为我想将进度条添加到JFrame中。我一直在寻找swingWorker,但它的使用并没有给我想要的进步
这是我的read函数。我也改变了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);
}
}
有没有办法做到这一点
提前谢谢
# 1 楼答案
最简单的方法是在已经存在的} 并查询}-method 来执行此操作
URL
-对象上打开一个^{Content-Length
http头字段。使用^{这将保存文件的长度(以字节为单位)。当您通过^{} 读取时,此方法将返回每次读取的实际字节数
伪代码
另见: