Java 10 MIDI设备名称Bug:设备名末尾出现随机字符
Java 10下MidiSystem查询MIDI设备名称出现随机/乱码字符的问题
我之前也碰到过这个情况!确实有不少使用Java 10进行MIDI编程的开发者反馈过类似问题:通过MidiSystem类查询到的MIDI设备名称末尾会莫名出现随机字符或者乱码,而Java 8、Java 9环境下完全正常。
先把你提到的测试程序补全,方便大家复现问题:
import javax.sound.midi.MidiDevice; import javax.sound.midi.MidiSystem; import javax.sound.midi.MidiUnavailableException; public class MidiDeviceNameBug { public static void main(String[] args) { MidiDevice.Info[] deviceInfos = MidiSystem.getMidiDeviceInfo(); for (MidiDevice.Info info : deviceInfos) { System.out.println("设备名称: " + info.getName()); System.out.println("设备描述: " + info.getDescription()); System.out.println("------------------------"); try { MidiDevice device = MidiSystem.getMidiDevice(info); // 可选:打开设备后再次验证名称 device.open(); System.out.println("打开后设备名称: " + device.getDeviceInfo().getName()); device.close(); } catch (MidiUnavailableException e) { e.printStackTrace(); } } } }
现象确认
在Java 8/9环境运行这段代码,输出的设备名称都是符合预期的正常字符串;但切换到Java 10后,很多设备名称的末尾会出现无意义的随机字符(比如奇怪的符号、乱码字节),例如原本的Microsoft GS Wavetable Synth可能变成Microsoft GS Wavetable Synth �kL。
可能的原因
根据社区开发者的讨论,这个问题大概率和Java 10中对本地系统MIDI设备名称的字符编码处理逻辑变更有关。Java 10在底层调用系统MIDI API获取名称时,没有正确处理字符串的终止符或者编码转换,导致内存中多余的随机字节被误当成了字符串的一部分输出。
临时解决方案
- 清理设备名称:可以通过字符串处理过滤掉乱码部分,比如用正则表达式移除非可打印字符:
String cleanDeviceName = info.getName().replaceAll("[^\\p{Print}]", ""); - 回退到旧版本Java:如果项目兼容性允许,暂时切换回Java 8或Java 9,这个问题在旧版本中不会出现;
- 升级Java 10小版本:Oracle在Java 10的后续小版本更新中可能修复过这类底层API问题,建议尝试升级到Java 10.0.2及以上版本测试。
内容的提问来源于stack exchange,提问作者Paul Nahay
相关产品推荐
相关产品推荐

