Вывод ввода / вывода в зависимости от размера буфера считывателя - PullRequest
0 голосов
/ 05 октября 2011

это продолжение моего прежнего вопроса здесь .

Результирующий файл, который должен быть волновым файлом, слишком большой, когда я использую байтовый массив, как в примере с размером 1024 * 32. Если я использую меньший размер, например, всего 32 байта, или даже сделать один байт, например,

fstr.write(this.stream.read());

работает отлично.

Следующий код:

import java.io.*;

class ErrorThread extends Thread {
    InputStream stream = null;

    public ErrorThread(InputStream stream) {
    this.stream = stream;
    }

    public void run() {
    try {
        byte[] buf = new byte[32 * 1024];
        int nRead = 0;
        while ((nRead = this.stream.read()) != -1) {

        }
        this.stream.close();
    }
    catch (Exception e) {
        e.printStackTrace();
    }
    }
}

class InputThread extends Thread {
    InputStream stream = null;

    public InputThread(InputStream stream) {
    this.stream = stream;
    }

    public void run() {
    try {
        FileOutputStream fstr = new FileOutputStream("test.wav");
        int nRead = 0;
        byte[] buf = new byte[1024 * 32];
        while ((nRead = this.stream.read(buf, 0, buf.length)) != -1) {
        fstr.write(buf, 0 , buf.length);
        }
        this.stream.close();
        fstr.close();
    }
    catch (Exception e) {
        e.printStackTrace();
    }
    }
}

public class Test {
    public static void main(String[] args) {
    try {
        Process p = new ProcessBuilder("lame", "--decode", "test.mp3", "-").start();
        ErrorThread et = new ErrorThread(p.getErrorStream());
        InputThread it = new InputThread(p.getInputStream());
        et.start();
        it.start();
        p.waitFor();
    }
    catch (Exception e) {
        e.printStackTrace();
    }
    }
}

1 Ответ

1 голос
/ 05 октября 2011
    fstr.write(buf, 0 , buf.length);

должно быть

    fstr.write(buf, 0 , nRead);

Если вход не кратен 32 КБ, вы записываете остатки в буфер.

...