Java技术问询:如何将AudioInputStream转换回InputStream?
解决Mendix中AudioInputStream存储FileDocument后格式错误的问题
问题原因分析
你遇到的核心问题是:AudioInputStream虽然继承自InputStream,但它并不包含完整的WAV文件字节流。
当你用AudioSystem.write(appendedFiles, AudioFileFormat.Type.WAVE, new File(...))保存到本地时,AudioSystem会自动帮你补充WAV文件的头部信息(包含音频格式、采样率、声道数等关键元数据),所以生成的文件是完整可播放的。但直接把AudioInputStream传给Core.storeFileDocumentContent时,它只会读取音频的原始帧数据,没有写入WAV文件头,导致播放器无法识别文件格式——虽然文件大小看起来一致,但缺失了关键的格式描述信息。
无本地文件的解决方案
你可以通过ByteArrayOutputStream在内存中完成完整WAV字节流的生成,再转成ByteArrayInputStream传给Mendix的存储方法,全程不需要本地文件:
// 拼接得到appendedFiles2之后,替换原来的本地保存和存储代码 ByteArrayOutputStream baos = new ByteArrayOutputStream(); // 将拼接后的AudioInputStream写入ByteArrayOutputStream,自动生成完整WAV头 AudioSystem.write(appendedFiles2, AudioFileFormat.Type.WAVE, baos); // 将输出流转为ByteArrayInputStream ByteArrayInputStream bais = new ByteArrayInputStream(baos.toByteArray()); // 现在用这个ByteArrayInputStream存储到FileDocument IMendixObject newobject = Core.instantiate(getContext(), "MusicBack.TestFile"); Core.storeFileDocumentContent(getContext(), newobject, "TEST.WAV", bais);
为什么直接传AudioInputStream不行?
AudioInputStream的设计目的是处理音频帧数据,它内部维护了音频格式信息,但读取时只会输出原始的采样数据(没有文件头)。而Mendix的storeFileDocumentContent需要的是完整的文件字节流——对于WAV来说,必须包含文件头(RIFF块、fmt块)和数据块两部分。直接传入AudioInputStream相当于只传了数据块,播放器无法解析格式,所以报错。
内容的提问来源于stack exchange,提问作者Brian Lorraine
相关产品推荐
相关产品推荐

