DataLine和(输出|输入)流之间的区别?

时间:2011-02-22 08:36:49

标签: java stream

我正在使用Java进行声音处理。在我的项目中,我必须处理流。所以我有很多工作人员要处理DataLineOutputStreamInputStream。 但对我来说,它们太相似了:(

有人可以帮我解决这个问题吗?提前致谢! 以下是我使用的一些代码:

        TargetDataLine line;
        ByteArrayOutputStream out = new ByteArrayOutputStream();
        int frameSizeInBytes = format.getFrameSize();
        int bufferLengthInFrames = line.getBufferSize() / 8;
        int bufferLengthInBytes = bufferLengthInFrames * frameSizeInBytes;
        byte[] data = new byte[bufferLengthInBytes];
        int numBytesRead;
try {
        line = (TargetDataLine) AudioSystem.getLine(info);
        line.open(format, line.getBufferSize());
    } catch (LineUnavailableException ex) {
        shutDown("Unable to open the line: " + ex);
        return;
    } catch (SecurityException ex) {
        shutDown(ex.toString());
        return;
    } catch (Exception ex) {
        shutDown(ex.toString());
        return;
    }
       line.start();
       while (thread != null) {
            if ((numBytesRead = line.read(data, 0, bufferLengthInBytes)) == -1) {
                break;
        }
        out.write(data, 0, numBytesRead);
       }

我已经阅读了类 TargetDataLine 的文档,据说:“'read(byte [] b,int off,int len)'从数据行的输入缓冲区读取音频数据。 “

但我们在哪里定义它?

TargetDataLine类型的线路还没有连接到任何调音台,所以我们怎么知道它的混音器是什么?

2 个答案:

答案 0 :(得分:2)

DataLine是与处理Java中的采样声音(a.k.a PCM数据)相关的接口。我真的不太了解它。

OutputStream是一个接口,表示可以获取写入字节的任何内容。 OutputStream的简单示例是FileOutputStream:写入该流的所有字节都将写入为其打开的文件。

InputStream是另一端:它是一个接口,表示可以从中读取字节的任何内容。 InputStream的简单示例是FileInputStream:它可用于从文件中读取数据。

因此,如果您要从硬盘读取音频数据,最终会使用FileInputStream来读取数据。如果你操纵它然后想把结果数据写回硬盘,你可以使用FileOutputStream进行实际的写作。

答案 1 :(得分:1)

InputStream代表一个字节流,我们可以读取字节一个(或块),直到它为空。 OutputStream是另一个方向 - 我们字节一个(或块),直到我们没有更多的东西要写。

Streams用于发送或接收非结构化字节数据。

DataLine处理音频数据,换句话说,具有特殊含义的字节。它提供了一些特殊的方法来控制线路(启动/停止),获取音频数据的实际格式和其他一些特性。