如何只提取音频文件并将它们放在arrayList中

时间:2014-03-30 10:54:05

标签: java audio java-api

我正在编写一个程序,我希望在arrayList中包含所有音频文件(.mp3,.wav等)文件 我的代码看起来像这样:

public class FileTest
{

    public ArrayList<File> list(String directoryName, ArrayList<File> files)
    {
        File directory = new File(directoryName);
        File[] fList = directory.listFiles();
        for (File file : fList) {
            if (file.isFile() **&& (if the file is an audio file)**) {
                files.add(file);
            } else if (file.isDirectory()) {
                list(file.getAbsolutePath(), files);
            }

        }

        return files;
    }

    public static void main(String[] args)
    {
        FileTest fileTest = new FileTest();

        ArrayList<File> files = new ArrayList<File>();

        files = fileTest.list("/media/kumuda/D804C38204C361DC/Program Files",files);

        for(File file : files)
        {
            System.out.println(file.getAbsolutePath());
        }
    }
}

我想在将文件添加到我的arraylist之前检查该文件是否是音频文件。 我搜索了api的并且遇到了Apache Tika库。 但我不知道它是如何工作的。 请有人帮帮我吗?

2 个答案:

答案 0 :(得分:2)

以下是使用Files进行此操作的方法。

首先,创建一个FileVisitor。扩展SimpleFileVisitor,因为它足以满足您的需求:

public final class AudioFileCollector
    extends SimpleFileVisitor<Path>
{
    private final List<Path> fileList;

    public AudioFileCollector(final List<Path> fileList)
    {
        this.fileList = fileList;
    }

    @Override
    public FileVisitResult visitFile(Path file, BasicFileAttributes attrs)
        throws IOException
    {
        // We know this is a regular file here, so now we just need to check the type
        switch (Files.probeContentType(file)) {
            case "audio/x-wav": // wav file
            case "audio/mpeg":  // mp3
                fileList.add(file);
            default:
        }
        return FileVisitResult.CONTINUE;
    }

    @Override
    public FileVisitResult postVisitDirectory(Path dir, IOException e)
        throws IOException
    {
        if (e != null)
            throw e;
        return FileVisitResult.CONTINUE;
    }

然后使用此访问者浏览您的目录:

final Path baseDir = Paths.get("...");
final List<Path> fileList = new ArrayList<>();
final FileVisitor<Path> collector = new AudioFileCollector(fileList);

Files.walkFileTree(baseDir, collector);

完成!

请注意使用Files.probeContentType()


使用Java 8的解决方案(我想它可能会更好):

public final class Main
{
    public static void main(final String... args)
        throws IOException
    {
        final List<String> extensions = Arrays.asList(".mp3", ".wav");
        final Path start = Paths.get("...");

        Files.walk(start).map(Object::toString)
            .filter(s -> extensions.stream().anyMatch(s::endsWith))
            .forEach(System.out::println);
    }

}

如果您想收集列表,请将.forEach()替换为.collect(Collectors.toList())

答案 1 :(得分:0)

最简单的方法是使用ragex并检查文件名是否与模式匹配。 (http://docs.oracle.com/javase/7/docs/api/java/util/regex/Pattern.html

这样的东西
if( Pattern.matches("[a-zA-Z0-9]+.mp3",file) || Pattern.matches("[a-zA-Z0-9]+.wav",file) )     
{
// your code here
}