gpt4 book ai didi

java - Java IO异常:从AudioInputStream写入文件时流关闭

转载 作者:行者123 更新时间:2023-12-03 02:07:59 25 4
gpt4 key购买 nike

因此,我下面的代码片段( concat 方法)主要尝试做两件事:

  • 将多个AudioInputStream(从源文件列表中读取)连接起来,成为一个最终的长流
  • 将该流写入目标WAV文件
    public static void concat(ArrayList<String> sourceFiles, String targetFile) {
    AudioInputStream targetBuilder = null;
    String file;
    AudioInputStream nextSource;
    for (int i = 0; i < sourceFiles.size(); i++)
    {
    file = sourceFiles.get(i);
    if(targetBuilder == null)
    {
    targetBuilder = AudioSystem.getAudioInputStream(new File(file));
    continue;
    }
    nextSource = AudioSystem.getAudioInputStream(new File(file));
    AudioInputStream appendedFiles = new AudioInputStream(
    new SequenceInputStream(targetBuilder, nextSource),
    targetBuilder.getFormat(),
    targetBuilder.getFrameLength() + nextSource.getFrameLength());
    targetBuilder = appendedFiles;
    nextSource.close();
    }
    AudioSystem.write(targetBuilder, AudioFileFormat.Type.WAVE, new File(targetFile));
    targetBuilder.close();
    }

  • 这个想法是从以下线程借来的: Join two WAV files from Java。现在的问题是连续执行了此代码段几次之后,最终它将在AudioSystem.write()行的“stream close”上引发IO Exception。堆栈跟踪如下所示:
    java.io.IOException: Stream Closed
    at java.io.FileInputStream.readBytes(Native Method)
    at java.io.FileInputStream.read(FileInputStream.java:272)
    at javax.sound.sampled.AudioInputStream.read(AudioInputStream.java:292)
    at java.io.SequenceInputStream.read(SequenceInputStream.java:208)
    at java.io.SequenceInputStream.read(SequenceInputStream.java:211)
    at javax.sound.sampled.AudioInputStream.read(AudioInputStream.java:292)
    at java.io.SequenceInputStream.read(SequenceInputStream.java:208)
    at javax.sound.sampled.AudioInputStream.read(AudioInputStream.java:292)
    ......//with the exact same two lines repeating lots of times
    at java.io.SequenceInputStream.read(SequenceInputStream.java:208)
    at javax.sound.sampled.AudioInputStream.read(AudioInputStream.java:292)
    at com.sun.media.sound.SunFileWriter$NoCloseInputStream.read(SunFileWriter.java:198)
    at java.io.SequenceInputStream.read(SequenceInputStream.java:208)
    at java.io.InputStream.read(InputStream.java:101)
    at com.sun.media.sound.WaveFileWriter.writeWaveFile(WaveFileWriter.java:239)
    at com.sun.media.sound.WaveFileWriter.write(WaveFileWriter.java:137)
    at javax.sound.sampled.AudioSystem.write(AudioSystem.java:1354)
    at com.mycompany.mypackage.AudioUtils.concat(AudioUtils.java:324)
    ......

    因此在我看来,是程序仍然尝试从AudioInputStream读取更多字节到文件时,但有时流( targetBuilder )自身会关闭。这对我来说没有意义,因为我仅在AudioSystem.write()方法之后关闭了此流。

    现在,如果我实际上在for循环中对此行发表评论:
    //nextSource.close();

    这个流关闭异常似乎消失了,取而代之的是“FilesNotFoundException:打开的文件太多”,这对我来说很有意义,因为在循环的每次迭代中,我都创建了一个新的AudioInputStream并将引用分配给nextSource,但是如果我从不关闭最终我用尽了打开的文件描述符。

    但是,我不明白的是,关闭此 nextSource 流将如何以任何方式影响 targetBuilder 流的行为?如果我关闭 nextSource 流,为什么此流突然关闭? (我假设两者之间存在联系,如果我错了,请纠正我)。

    谢谢!

    最佳答案

    SequenceInputStream不会在内存中复制您的流,只是记住链接...这是read方法的代码

    public int read() throws IOException
    {
    int ch = -1;

    while (in != null && (ch = in.read()) < 0)
    {
    in.close();
    in = getNextStream();
    }

    return ch;
    }

    因此,如果您要关闭添加到SequenceInputStream的流之一,则会得到异常

    关于java - Java IO异常:从AudioInputStream写入文件时流关闭,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26519845/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com