You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.21 04:12:10