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

Java IO异常:从AudioInputStream写入文件时流关闭,java,audio,stream,ioexception,Java,Audio,Stream,Ioexception,因此,我下面的代码片段concat方法主要尝试做两件事: 将从源文件列表中读取的多个AudioInputStream连接到最后一个长流中 将该流写入目标WAV文件 public static void concat(ArrayList<String> sourceFiles, String targetFile) { AudioInputStream targetBuilder = null; String file; AudioInputStream nex

因此,我下面的代码片段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();
}
所以在我看来,这是当程序仍然试图从AudioInputStream读取更多字节到文件时,但在某个点上,流targetBuilder只是关闭了自己。这对我来说没有意义,因为我只在AudioSystem.write方法之后关闭此流

现在,如果我在for循环中对这一行进行注释:

//nextSource.close();
这个stream close异常似乎消失了,取而代之的是FileNotFoundException:太多打开的文件,这对我来说很有意义,因为在循环的每次迭代中,我都会创建一个新的AudioInputStream并将引用分配给nextSource,但如果我从未关闭它,最终打开的文件描述符就会用完

然而,我不明白的是,为什么关闭这个nextSource流会以任何方式影响targetBuilder流的行为?如果我关闭下一个源流,为什么该流会突然关闭?我假设两者之间有联系,如果我错了,请纠正我


谢谢

SequenceInputStream不会将您的流复制到内存中,它只是记住链接。。。下面是读取方法的代码

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

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

  return ch;
}

因此,如果您关闭SequenceInputStream中添加的一个流,您将得到异常

谢谢!你的意思是所有的内容只是作为一些参考放在一些流的地方,只有当它真正涉及到AudioSystem.write时才会被消费?但这并不是每次都会发生。此方法的前几次执行通常会成功。另外,在这种情况下,您会推荐什么作为解决方法?显然,我不能让流保持打开状态,因为它将达到打开文件描述符的限制,而且我连接了大量流…在写入之后,您需要关闭这些下一个源来关闭打开的文件。@DiogoSantana这是什么意思?nextSource仅在for循环内具有作用域,并且在for循环完成时必须进行写入。即使我在写入后关闭它,我也只是关闭nextSource引用的最后一个流。我这样做了,它仍然会吐出太多的打开文件异常…AudioInputStream在内部使用FileInputStream。创建的每个FileInputStream都会在操作系统上打开内部文件。因此,您需要更改代码的逻辑,以便能够在写入后关闭所有。请尝试将所有内容添加到列表中。然后迭代列表,关闭每个列表。
public int read() throws IOException
{
  int ch = -1;

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

  return ch;
}