在 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 的文件。

  1. 是否有明确的方法来同时包含所有这些文件类型扩展名?
  2. 如果没有,那么如何显示目录中的所有文件"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