2014-03-30 18 views
1

我写一个程序,我想我所有的音频文件(.MP3,.WAV等)中的文件的ArrayList 我的代码看起来是这样的:如何提取纯音频文件,并把它们的ArrayList

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()); 
     } 
    } 
} 

我想在将文件添加到我的数组列表之前检查文件是否是音频文件。 我搜索了API并且遇到了Apache Tika库。 但我没有得到它是如何工作的。 请任何人都可以帮我吗?

+0

所以问题只是如何决定一个文件是否是一个音频文件,是否正确? –

+2

你坚持使用Java 6吗?如果不是,您应该尝试使用['Files.walkFileTree()'](http://docs.oracle.com/javase/8/docs/api/java/nio/file/Files.html#walkFileTree-java。 nio.file.Path-java.nio.file.FileVisitor-)并作出适当的访问 – fge

回答

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); 
    } 

} 

如果你想在一个列表收集,用.collect(Collectors.toList())更换.forEach()

+0

这是一个非常好的解决方案!虽然不应该总是依赖MIME类型(当涉及到安全性等)时,在这种情况下,它是完美的 - 快速和高效。打开每个文件并验证它会非常慢。感谢鼓舞人心的解决方案! – tzima

相关问题