在 Java 中排除文件名过滤器中的扩展名
Exclude extensions in filename filter in Java
我的控制器方法(它有一个方法来列出文件,从 属性 文件中提到的路径,JSP)
private String[] getFileListing(String servers) throws IOException {
Properties prop = new Properties();
String propFileName = "config.properties";
InputStream input = getClass().getClassLoader().getResourceAsStream(propFileName);
prop.load(input);
if (servers.equals("MS1")) {
File f = new File(prop.getProperty("path.MS1"));
String[] list = f.list(new FilenameFilter() {
public boolean accept(File dir, String name) {
return name.toLowerCase().endsWith(".txt")||name.endsWith(".log");
}
});
return list;
} else {
File f = new File(prop.getProperty("path.MS2"));
String[] list = f.list(new FilenameFilter() {
public boolean accept(File dir, String name) {
return name.toLowerCase().endsWith(".txt")||name.endsWith(".log");
}
});
return list;
}
}
我想显示具有常见扩展名的日志文件,例如 - .txt 或 .log
但是系统也会创建扩展名为 .1 .2 .3 的文件。
- 是否有明确的方法来同时包含所有这些文件类型扩展名?
- 如果没有,那么如何显示目录中的所有文件"excluding"某些文件类型。 (我想从目录中排除一些其他系统生成的文件)。
谢谢!
您可以return没有特定文件扩展名的文件。
private String[] getFileListing(String servers) throws IOException {
Properties prop = new Properties();
String propFileName = "config.properties";
InputStream input = getClass().getClassLoader().getResourceAsStream(propFileName);
prop.load(input);
if (servers.equals("MS1")) {
File f = new File(prop.getProperty("path.MS1"));
String[] list = f.list(new FilenameFilter() {
public boolean accept(File dir) {
return ! (dir.toLowerCase().endsWith(".gz")||dir.endsWith(".sh")) && dir.isFile();
}
});
return list;
} else {
File f = new File(prop.getProperty("path.MS2"));
String[] list = f.list(new FilenameFilter() {
public boolean accept(File dir) {
return ! (dir.toLowerCase().endsWith(".gz")||dir.endsWith(".sh")) && dir.isFile();
}
});
return list;
}
}
你可以用这段代码做一些事情,老实说,我只是重构了一下,让你的白名单成为一个扩展的 ArrayList。
例如:
private String[] getFileListing(String servers) throws IOException {
List<String> allowedExtensions = Arrays.asList("log txt".split(" "));
Properties prop = new Properties();
String propFileName = "config.properties";
InputStream input = getClass().getClassLoader().getResourceAsStream(propFileName);
prop.load(input);
File f = new File(prop.getProperty("path." + servers));
String[] list = f.list(new FilenameFilter() {
public boolean accept(File dir, String name) {
return allowedExtensions.contains(name.substring(name.lastIndexOf(".") + 1, name.length()));
}
});
return list;
}
但是,话虽这么说,您的代码中还有其他一些可以优化的地方,例如,正如我在上面所做的更改,您正在检查服务器字符串是否等于某个内容,然后加载它,我假设因为你只有 MS1 和 MS2,也就是说,如果意图是它总是在除 MS1 之外的每个服务器参数上加载 MS2,你可以这样做:
private String[] getFileListing(String servers) throws IOException {
List<String> allowedExtensions = Arrays.asList("log txt".split(" "));
Properties prop = new Properties();
String propFileName = "config.properties";
InputStream input = getClass().getClassLoader().getResourceAsStream(propFileName);
prop.load(input);
File f = new File(prop.getProperty("path.ms2"));
if(servers.equals("MS1")){
f = new File(prop.getProperty("path." + servers));
}
String[] list = f.list(new FilenameFilter() {
public boolean accept(File dir, String name) {
return allowedExtensions.contains(name.substring(name.lastIndexOf(".") + 1, name.length()));
}
});
return list;
}
如果你想支持其他东西,比如 .log.1 或 .log.2,这种方法行不通,但你可以将其反转并将列表设为扩展名黑名单,或者使用正则表达式来匹配文件名,例如,任何以 .log 或 .log.
结尾的文件
此正则表达式将匹配符合白名单条件的任何文件名:
^.+(.log|.txt)(.\d)?$
您可以通过一些示例匹配看到这一点 here
我的控制器方法(它有一个方法来列出文件,从 属性 文件中提到的路径,JSP)
private String[] getFileListing(String servers) throws IOException {
Properties prop = new Properties();
String propFileName = "config.properties";
InputStream input = getClass().getClassLoader().getResourceAsStream(propFileName);
prop.load(input);
if (servers.equals("MS1")) {
File f = new File(prop.getProperty("path.MS1"));
String[] list = f.list(new FilenameFilter() {
public boolean accept(File dir, String name) {
return name.toLowerCase().endsWith(".txt")||name.endsWith(".log");
}
});
return list;
} else {
File f = new File(prop.getProperty("path.MS2"));
String[] list = f.list(new FilenameFilter() {
public boolean accept(File dir, String name) {
return name.toLowerCase().endsWith(".txt")||name.endsWith(".log");
}
});
return list;
}
}
我想显示具有常见扩展名的日志文件,例如 - .txt 或 .log 但是系统也会创建扩展名为 .1 .2 .3 的文件。
- 是否有明确的方法来同时包含所有这些文件类型扩展名?
- 如果没有,那么如何显示目录中的所有文件"excluding"某些文件类型。 (我想从目录中排除一些其他系统生成的文件)。
谢谢!
您可以return没有特定文件扩展名的文件。
private String[] getFileListing(String servers) throws IOException {
Properties prop = new Properties();
String propFileName = "config.properties";
InputStream input = getClass().getClassLoader().getResourceAsStream(propFileName);
prop.load(input);
if (servers.equals("MS1")) {
File f = new File(prop.getProperty("path.MS1"));
String[] list = f.list(new FilenameFilter() {
public boolean accept(File dir) {
return ! (dir.toLowerCase().endsWith(".gz")||dir.endsWith(".sh")) && dir.isFile();
}
});
return list;
} else {
File f = new File(prop.getProperty("path.MS2"));
String[] list = f.list(new FilenameFilter() {
public boolean accept(File dir) {
return ! (dir.toLowerCase().endsWith(".gz")||dir.endsWith(".sh")) && dir.isFile();
}
});
return list;
}
}
你可以用这段代码做一些事情,老实说,我只是重构了一下,让你的白名单成为一个扩展的 ArrayList。
例如:
private String[] getFileListing(String servers) throws IOException {
List<String> allowedExtensions = Arrays.asList("log txt".split(" "));
Properties prop = new Properties();
String propFileName = "config.properties";
InputStream input = getClass().getClassLoader().getResourceAsStream(propFileName);
prop.load(input);
File f = new File(prop.getProperty("path." + servers));
String[] list = f.list(new FilenameFilter() {
public boolean accept(File dir, String name) {
return allowedExtensions.contains(name.substring(name.lastIndexOf(".") + 1, name.length()));
}
});
return list;
}
但是,话虽这么说,您的代码中还有其他一些可以优化的地方,例如,正如我在上面所做的更改,您正在检查服务器字符串是否等于某个内容,然后加载它,我假设因为你只有 MS1 和 MS2,也就是说,如果意图是它总是在除 MS1 之外的每个服务器参数上加载 MS2,你可以这样做:
private String[] getFileListing(String servers) throws IOException {
List<String> allowedExtensions = Arrays.asList("log txt".split(" "));
Properties prop = new Properties();
String propFileName = "config.properties";
InputStream input = getClass().getClassLoader().getResourceAsStream(propFileName);
prop.load(input);
File f = new File(prop.getProperty("path.ms2"));
if(servers.equals("MS1")){
f = new File(prop.getProperty("path." + servers));
}
String[] list = f.list(new FilenameFilter() {
public boolean accept(File dir, String name) {
return allowedExtensions.contains(name.substring(name.lastIndexOf(".") + 1, name.length()));
}
});
return list;
}
如果你想支持其他东西,比如 .log.1 或 .log.2,这种方法行不通,但你可以将其反转并将列表设为扩展名黑名单,或者使用正则表达式来匹配文件名,例如,任何以 .log 或 .log.
结尾的文件此正则表达式将匹配符合白名单条件的任何文件名:
^.+(.log|.txt)(.\d)?$
您可以通过一些示例匹配看到这一点 here