Java控制台MP3播放器读取ArrayList路径报FileNotFoundException求助
问题根源
从你的控制台报错信息一眼就能发现关键问题:
java.io.FileNotFoundException: "/Users/harvhead/Desktop/San Tropez.mp3" (No such file or directory)
注意到路径被双引号包裹了!但实际你的本地文件路径是没有引号的——这就是导致FileNotFoundException的核心原因。你从文本文件读取的路径字符串带了多余的双引号,而硬编码时你写的是不带引号的正确路径,所以能正常播放。
问题出在哪
在PlayMusic类的access()方法中,你直接把分割后的路径字符串存入trackPath集合,完全没处理文本文件里路径自带的双引号:
String Pathtrack = details[5]; trackPath.add(Pathtrack);
你的music.txt里的条目应该是类似这种格式:
San Tropez,Pink Floyd,4:28,Rock,1,"/Users/harvhead/Desktop/San Tropez.mp3"
用逗号分割后,details[5]拿到的就是带双引号的字符串"/Users/harvhead/Desktop/San Tropez.mp3",用这个带引号的路径去找文件,系统自然找不到。
解决方案
只需要在读取路径时,去除字符串首尾的双引号即可,这里给你两种实用的处理方式:
方法1:正则去除首尾引号(兼容所有Java版本)
修改access()方法里路径赋值的代码:
// 去掉字符串开头和结尾的双引号 String Pathtrack = details[5].replaceAll("^\"|\"$", ""); trackPath.add(Pathtrack);
^\"匹配字符串开头的双引号,\"$匹配结尾的双引号,replaceAll会把这两个位置的引号清空。
方法2:用strip()简化处理(Java 11+可用)
如果你的Java版本是11或更高,可以用更简洁的写法:
// 直接去除首尾的双引号 String Pathtrack = details[5].strip("\""); trackPath.add(Pathtrack);
验证修改
改完之后再运行代码,trackPath.get(x)输出的路径就会和你硬编码的完全一致(不带引号),FileInputStream就能正确定位到MP3文件了。
调试小技巧
以后遇到类似路径问题,建议输出路径时给内容加个边界标记,比如:
System.out.println("当前路径:[" + trackPath.get(x) + "]");
这样能一眼看到路径前后有没有多余的空格、引号这类隐藏字符,快速定位问题。
内容的提问来源于stack exchange,提问作者harvhead

