Java中提取WAV文件字节的实现方法咨询及问题排查
Java提取WAV文件字节数据的正确方法
你的代码无法正常运行的核心原因是:WAV是二进制文件,而Scanner是为文本文件设计的工具,它会按照字符编码解析内容,导致二进制数据被破坏,无法正确提取原始字节。
以下是两种可靠的实现方式:
方法一:一次性读取全部字节(适合小文件)
这种方式简单直接,通过Files.readAllBytes快速获取整个文件的字节数组,还可以根据WAV格式跳过文件头,只提取音频数据:
import java.io.File; import java.nio.file.Files; import java.io.IOException; public class AudioFiles { public static void main(String[] args) { try { File wavFile = new File("audio.wav"); // 读取文件所有字节 byte[] fullFileBytes = Files.readAllBytes(wavFile.toPath()); System.out.println("WAV文件总字节数:" + fullFileBytes.length); // 标准PCM WAV文件头通常为44字节,跳过头部提取音频数据 if (fullFileBytes.length > 44) { byte[] audioDataBytes = new byte[fullFileBytes.length - 44]; System.arraycopy(fullFileBytes, 44, audioDataBytes, 0, audioDataBytes.length); System.out.println("音频数据字节数:" + audioDataBytes.length); // 这里可以对audioDataBytes进行后续处理 } } catch (IOException e) { e.printStackTrace(); } } }
方法二:流式逐字节读取(适合大文件)
如果WAV文件较大,一次性读取会占用过多内存,推荐用FileInputStream流式读取,避免内存压力:
import java.io.File; import java.io.FileInputStream; import java.io.IOException; public class AudioFiles { public static void main(String[] args) { FileInputStream inputStream = null; try { File wavFile = new File("audio.wav"); inputStream = new FileInputStream(wavFile); byte[] buffer = new byte[4096]; // 4KB缓冲区,可根据需求调整 int bytesRead; // 循环读取直到文件末尾 while ((bytesRead = inputStream.read(buffer)) != -1) { // 处理本次读取到的buffer中前bytesRead个字节 // 示例:输出读取长度,实际可写入文件、解析采样等 System.out.println("本次读取字节数:" + bytesRead); } } catch (IOException e) { e.printStackTrace(); } finally { // 确保流关闭 if (inputStream != null) { try { inputStream.close(); } catch (IOException e) { e.printStackTrace(); } } } } }
注意事项
- 标准PCM格式的WAV文件头长度为44字节,但部分非标准WAV可能有不同长度的头部,若需要精准提取音频数据,建议先解析WAV头中的
Subchunk2Size等字段,确定音频数据的起始位置和长度。
内容的提问来源于stack exchange,提问作者P4L
相关产品推荐
相关产品推荐

