Исключить расширения в фильтре имени файла в Java


Метод My 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. Если нет, то как отобразить все файлы, «исключая» некоторые типы файлов в каталоге. (Я хотел бы исключить некоторые другие файлы, сгенерированные системой, из каталога).

Спасибо!


person Niharika Pandey    schedule 15.05.2018    source источник
comment
Чтобы исключить тип файла, почему бы просто не использовать !name.toLowerCase().endsWith("...")?   -  person DodgyCodeException    schedule 15.05.2018


Ответы (2)


Вы можете сделать несколько вещей с этим кодом, я бы, честно говоря, просто реорганизовал его совсем немного, и ваш белый список был бы 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, при этом, если намерение состояло в том, чтобы всегда загружать MS2 для каждого параметра сервера, кроме MS1, вы могли бы сделать это следующим образом:

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)?$

Вы можете увидеть это на примере некоторых совпадений здесь

person Zachary Craig    schedule 15.05.2018
comment
Спасибо @zack6849. Я понял! - person Niharika Pandey; 15.05.2018

Вы можете вернуть файлы, которые не имеют определенных расширений файлов.

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;
        }
    }
person Eby Jacob    schedule 15.05.2018
comment
Отсутствуют круглые скобки вокруг выражений «ИЛИ»? - person DodgyCodeException; 15.05.2018
comment
обновил ответ на основе вашего комментария, спасибо, что подняли это. - person Eby Jacob; 15.05.2018
comment
Спасибо @EbyJacob. Я могу сделать эту работу, но я также получаю папки со всеми файлами. Как исключить их в моем коде? - person Niharika Pandey; 15.05.2018
comment
Привет, Нихарика, обновил код, чтобы исключить подкаталоги в папке. проверьте, работает ли это - person Eby Jacob; 15.05.2018