有没有使用 java 快速获取设备上所有音频文件的方法?
Is there a fast way to get all audio files on a device using java?
初学者 Java 程序员。我正在尝试在我的 mac(最终 Android)上制作一个简单的 mp3
播放器,我想让它自动识别所有音乐(mp3
)已经在您的设备上。
我有一个简单的 for 循环设置,它从主目录开始并遍历所有其他目录以查找 mp3s
。我还没有看到它完成循环,因为我总是不得不强行停止它,因为它持续了很长时间。我可以排除一些文件夹,因为在其中放置音乐是没有意义的,但我觉得有更好的方法。
有没有我可以研究的比 for
循环更快 and/or 更有效的方法?
我也很好奇 mac 中的查找器是如何工作的。例如,当我使用查找器查找 mac 上的所有 mp3
文件时,结果只需要几秒钟就可以显示出来,我只需输入一些搜索条件即可。如果有人能指出我如何完成与此类似的事情的方向,那就太好了,我会接受我能得到的任何意见!
public static void findAudio(File currentDir) {
File[] filesInDir = currentDir.listFiles();
if (filesInDir != null){
if (filesInDir.length == 0){
return;
}
else {
for (File file : filesInDir) {
if (!file.isHidden()) {
if (file.isDirectory()) {
findAudio(file);
}
if (file.canRead()) {
if (file.getName().endsWith(".mp3")) {
System.out.println(file.getPath());
}
}
}
}
}
}
else {
System.out.println(currentDir.getPath() + " is null -- skipping");
}
}
import java.io.*;
public static void extract(String p) {
File f = new File(p);
File l[] = f.listFiles();
for(File x : l){
if (x==null) return;
if (x.isHidden()||!x.canRead()) continue;
if (x.isDirectory()) extract(x.getPath());
else if (x.getName().endsWith(".mp3"))
System.out.println(x.getPath()+"\"+x.getName());
}
}
首先,检查文件扩展名比检查文件是否可读更省时。
此外,您可以使用 Java 8 中添加的 Files.walkFileTree
方法。
在 oracle 的站点上有一个关于如何使用它的教程:https://docs.oracle.com/javase/tutorial/essential/io/walk.html
代码看起来像这样:
Files.walkFileTree(Paths.get(sourcePath), new SimpleFileVisitor<>() {
@Override
public FileVisitResult visitFile(Path filePath, BasicFileAttributes attrs) {
if (filePath.toString().endsWith(".mp3") && filePath.toFile().canRead()) {
System.out.println(filePath.toString());
}
return FileVisitResult.CONTINUE;
}
@Override
public FileVisitResult visitFileFailed(Path file, IOException exc) {
System.err.println("Failed reading \"" + file.toString() + "\" -- skipping");
return FileVisitResult.CONTINUE;
}
});
SimpleFileVisitor
class 是 FileVisitor
界面的简化实现,具有访问所有文件和 re-throw I/O 错误的默认行为。
如果出现 I/O 错误,我们仅将文件路径打印到默认错误流并继续文件处理。
如果没有错误,文件扩展名为“.mp3”(如上所述首先检查扩展名),并且文件是可读的,我们将文件路径打印到默认输出流(你也可以做其他事情,比如将其添加到媒体文件列表)
初学者 Java 程序员。我正在尝试在我的 mac(最终 Android)上制作一个简单的 mp3
播放器,我想让它自动识别所有音乐(mp3
)已经在您的设备上。
我有一个简单的 for 循环设置,它从主目录开始并遍历所有其他目录以查找 mp3s
。我还没有看到它完成循环,因为我总是不得不强行停止它,因为它持续了很长时间。我可以排除一些文件夹,因为在其中放置音乐是没有意义的,但我觉得有更好的方法。
有没有我可以研究的比 for
循环更快 and/or 更有效的方法?
我也很好奇 mac 中的查找器是如何工作的。例如,当我使用查找器查找 mac 上的所有 mp3
文件时,结果只需要几秒钟就可以显示出来,我只需输入一些搜索条件即可。如果有人能指出我如何完成与此类似的事情的方向,那就太好了,我会接受我能得到的任何意见!
public static void findAudio(File currentDir) {
File[] filesInDir = currentDir.listFiles();
if (filesInDir != null){
if (filesInDir.length == 0){
return;
}
else {
for (File file : filesInDir) {
if (!file.isHidden()) {
if (file.isDirectory()) {
findAudio(file);
}
if (file.canRead()) {
if (file.getName().endsWith(".mp3")) {
System.out.println(file.getPath());
}
}
}
}
}
}
else {
System.out.println(currentDir.getPath() + " is null -- skipping");
}
}
import java.io.*;
public static void extract(String p) {
File f = new File(p);
File l[] = f.listFiles();
for(File x : l){
if (x==null) return;
if (x.isHidden()||!x.canRead()) continue;
if (x.isDirectory()) extract(x.getPath());
else if (x.getName().endsWith(".mp3"))
System.out.println(x.getPath()+"\"+x.getName());
}
}
首先,检查文件扩展名比检查文件是否可读更省时。
此外,您可以使用 Java 8 中添加的 Files.walkFileTree
方法。
在 oracle 的站点上有一个关于如何使用它的教程:https://docs.oracle.com/javase/tutorial/essential/io/walk.html
代码看起来像这样:
Files.walkFileTree(Paths.get(sourcePath), new SimpleFileVisitor<>() {
@Override
public FileVisitResult visitFile(Path filePath, BasicFileAttributes attrs) {
if (filePath.toString().endsWith(".mp3") && filePath.toFile().canRead()) {
System.out.println(filePath.toString());
}
return FileVisitResult.CONTINUE;
}
@Override
public FileVisitResult visitFileFailed(Path file, IOException exc) {
System.err.println("Failed reading \"" + file.toString() + "\" -- skipping");
return FileVisitResult.CONTINUE;
}
});
SimpleFileVisitor
class 是 FileVisitor
界面的简化实现,具有访问所有文件和 re-throw I/O 错误的默认行为。
如果出现 I/O 错误,我们仅将文件路径打印到默认错误流并继续文件处理。
如果没有错误,文件扩展名为“.mp3”(如上所述首先检查扩展名),并且文件是可读的,我们将文件路径打印到默认输出流(你也可以做其他事情,比如将其添加到媒体文件列表)