在Java中复制Directory.GetFiles(String,String)
本文关键字:String GetFiles Directory Java 复制 | 更新日期: 2023-09-27 18:22:35
概述
我正在将一个简单的实用程序从C#移植到Java中,作为这项工作的一部分,我正在为我喜欢C#语义的项目编写一些辅助方法。一旦这种情况是CCD_ 1。
当前代码
import java.io.File;
import java.io.FilenameFilter;
public class Directory {
public static String[] GetFiles(String path) {
File directory = new File(path);
return directory.list(new FilenameFilter() {
@Override
public boolean accept(File dir, String filename) {
return new File(dir, filename).isFile();
}
});
}
}
问题
虽然上面的一切看起来都很好,并且复制了其中一个GetFiles重载,但我一直在思考如何最好地编写一个复制C#的Directory.GetFiles(String, String)
功能的方法。
此方法应该采用path
字符串和searchPattern
,后者用于仅返回与该特定模式匹配的文件。
例如,以下各项都应该有效:
// Used to get all JavaScript files
Directory.GetFiles("~/Documents/", "*.js");
// Get all CSS files in the styles sub-folder.
Directory.GetFiles("~/Documents/", "styles/*.css");
您可以通过在每个星号和问号之前放置一个句点来修改模式,然后将其用作正则表达式来确定应返回哪些文件。所以,你可以写一些类似的东西
public static String[] GetFiles(final String path, final String searchPattern) {
final Pattern re = Pattern.compile(searchPattern.replace("*", ".*").replace("?", ".?"));
return new File(path).list(new FilenameFilter() {
@Override
public boolean accept(File dir, String name) {
return new File(dir, name).isFile() && re.matcher(name).matches();
}
});
}
以Adam Michalcin的答案为基础,我得出了以下结果(注意,这些方法返回一个绝对路径数组:
import java.io.File;
import java.io.FilenameFilter;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.regex.Pattern;
public class Directory {
public static String[] GetFiles(String path) {
File directory = new File(path);
File[] matchingFiles = directory.listFiles(new FilenameFilter() {
@Override
public boolean accept(File dir, String filename) {
return new File(dir, filename).isFile();
}
});
ArrayList<String> files = new ArrayList<String>();
for (File file : matchingFiles) {
files.add(file.getAbsolutePath());
}
return (String[])files.toArray(new String[files.size()]);
}
public static String[] GetFiles(String path, final String searchPattern) {
// Split the searchPattern incase we have directories in there
ArrayList<String> pattern = new ArrayList<String>(Arrays.asList(searchPattern.split("/")));
// Take the last element out from the array, as this will be the file pattern
String filePattern = pattern.remove(pattern.size() - 1);
// Insert the base path into the remaining list
pattern.add(0, path);
// Now lets concat the lot to create a base path
path = Path.combine((String[])pattern.toArray(new String[pattern.size()]));
final Pattern regEx = Pattern.compile(filePattern.replace("*", ".*").replace("?", ".?"));
File directory = new File(path);
File[] matchingFiles = directory.listFiles(new FilenameFilter() {
@Override
public boolean accept(File dir, String filename) {
return new File(dir, filename).isFile() && regEx.matcher(filename).matches();
}
});
ArrayList<String> files = new ArrayList<String>();
for (File file : matchingFiles) {
files.add(file.getAbsolutePath());
}
return (String[])files.toArray(new String[files.size()]);
}
}
这还利用了我设置的另一个助手(Path.combine
):
import java.io.File;
public class Path {
public static String combine(String... paths)
{
File file = new File(paths[0]);
for (int i = 1; i < paths.length ; i++) {
file = new File(file, paths[i]);
}
return file.getPath();
}
}
用法
Directory.GetFiles("/Users/beardtwizzle/", "/Documents/javascripts/*.js");
这仍然是布鲁诺·席尔瓦提到的另一个性格问题。所以我也会试着为它烤一个补丁。