在Java中排除文件名过滤器中的扩展名

尼哈里卡(Niharika Pandey)

我的Controller方法(该方法具有在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. 如果没有,那么如何显示所有文件“排除”目录中的某些文件类型。(我想从目录中排除其他一些系统生成的文件)。

谢谢!

扎卡里·克雷格(Zachary Craig)

您可以用这段代码做几件事情,老实说,我只需要重构一下,并将白名单作为扩展的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,则此方法不起作用,但是您可以将其倒置并使列表成为扩展名黑名单,或者使用regex匹配文件名。 ,以.log或.log结尾的任何文件。

此正则表达式将匹配出现在白名单条件下的任何文件名:

^.+(.log|.txt)(.\d)?$

您可以在这里看到一些匹配示例

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章