0

私はJavaでファイルをダウンロードするのは初めてで、それがばかげた質問である場合は申し訳ありませんが、2日間検索したので、解決策を得ることができませんでした。アプレット内で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);
    }
}

これを達成する方法はありますか?

前もって感謝します。

4

1 に答える 1

0

最も簡単な方法はURLConnection、既に存在するURL-objectを開いてContent-Lengthhttp-header フィールドを照会することです。getContentLength()これを行うには -メソッドを使用します。

int大きなファイルをダウンロードする場合は、コンテンツの長さを保持するのに十分な大きさではない可能性があることに注意してください。したがって、 getContentLengthLong()優先する必要があります。このメソッドは Java 7 以降で使用できます

これにより、ファイルの長さがバイト単位で保持されます。経由で読み取る場合AudioInputStream.read()、このメソッドは毎回読み取られる実際のバイト数を返します。

擬似コード

long totalLength = con.getContentLengthLong();
while still reading{
  long totalBytesRead += in.read();
  print "Process: "+(totalBytesRead * 100 / totalLength);
}

も参照してください

于 2013-03-02T16:28:49.197 に答える