我正在编写一个程序,我希望在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库。 但我不知道它是如何工作的。 请有人帮帮我吗?
答案 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
}