#java #algorithm #file #audio #mp3
#java #алгоритм #файл #Аудио #mp3
Вопрос:
Начинающий Java-программист здесь. Я пытаюсь создать простой mp3
проигрыватель на моем Mac (и, в конечном счете, Android), и я хотел бы, чтобы он автоматически распознавал всю музыку ( mp3
), которая уже есть на вашем устройстве.
У меня есть простая настройка цикла for, которая начинается с домашнего каталога и перебирает все другие каталоги в поисках mp3s
. Я еще не видел, чтобы это завершало цикл, поскольку мне всегда приходится принудительно останавливать его, потому что это продолжается так долго. Я мог бы просто исключить некоторые папки, потому что размещение музыки в них просто не имело бы смысла, но я чувствую, что есть подход получше.
Есть ли какие-либо другие методы, которые я мог бы изучить, которые быстрее и / или эффективнее, чем for
цикл?
Мне также любопытно, как работает finder на Mac. Например, когда я использую Finder для поиска всех mp3
файлов на моем Mac, отображение результатов занимает всего пару секунд, и все, что мне нужно, это ввести некоторые критерии поиска. Если бы кто-нибудь мог указать мне, как выполнить что-то подобное этому, что было бы здорово, я приму любой ввод, который смогу получить!
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");
}
}
Ответ №1:
Перво-наперво, проверка расширения файла занимает меньше времени, чем проверка того, доступен ли файл для чтения.
Кроме того, вы можете использовать Files.walkFileTree
метод, добавленный в Java 8 для этого.
На сайте 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") amp;amp; 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
класс — это упрощенная реализация FileVisitor
интерфейса с поведением по умолчанию для просмотра всех файлов и повторного запуска ошибок ввода-вывода.
В случае ошибки ввода-вывода мы только выводим путь к файлу в поток ошибок по умолчанию и продолжаем обработку файла.
В случае отсутствия ошибок расширение файла равно «.mp3» (сначала проверяем расширение, как указано выше), и файл доступен для чтения, мы печатаем путь к файлу выходного потока по умолчанию (вы также можете сделать другие вещи, например, добавить его в список медиафайлов)
Комментарии:
1. Спасибо за информацию! Мне придется заглянуть в упомянутый вами метод Files.walkFileTree
Ответ №2:
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());
}
}
Комментарии:
1. Ответы только с кодом не очень полезны. Добавьте объяснение к тому, что делает код