Регулярное выражение для имени файла, содержащего строку в любом месте Java - PullRequest
2 голосов
/ 28 мая 2020

Приносим извинения, если это неправильно сформулировано ..

В основном у меня есть эта строка в сервлете -

FileInputStream flinp = new FileInputStream("C:\\xampp\\img\\"+empid+".jpg");

где empid - это строка.

Итак, в настоящее время я получаю файлы с empid в качестве имени, но мне нужно получить файлы, у которых есть empid ВЕЗДЕ в имени ... так, например, если мой empid равен 2500, мне нужно получить файл, если он называется как-нибудь вроде -

  • 2500_Amy
  • Amy_2500
  • Amy2500
  • 2500Amy

et c .. Может кто-нибудь помочь с этим? Мне нужно использовать регулярное выражение, и если да, то что мне писать? Спасибо

Я пробовал это, но выдает ошибку -

FileInputStream flinp = new FileInputStream("C:\\xampp\\img\\"+.*?empid.*+".jpg");

ИЗМЕНИТЬ -

Кстати, в моем jsp у меня есть все oop с этой строкой в ​​нем, так что несколько empid передаются сервлету «ReadImage» и считываются несколько изображений ... не уверен, что это меняет мой вопрос, но просто чтобы добавить его -

<img src='<%=request.getContextPath()%>/ReadImages?id<%=thisemp.getEmpGid()%>'

Ответы [ 4 ]

2 голосов
/ 28 мая 2020

Вам нужно будет использовать FileVisitor и пройти по иерархии файловой системы. Используйте посетителя и созданное вами регулярное выражение для фильтрации и сбора списка файлов, соответствующих вашим критериям.

https://docs.oracle.com/javase/8/docs/api/java/nio/file/FileVisitor.html

1 голос
/ 28 мая 2020

Простое решение с использованием старого java IO (которое я делаю вывод из использования FileInputStream) может быть:

public static void main(String[] args) throws FileNotFoundException {
    String dirName = "c:/stuff";
    File directory = new File(dirName);
    String[] pathnames = directory.list();

    FileInputStream fis = findFirstMatching(dirName, pathnames, "38");
    if (fis != null) {
        //your code
    }
}

static FileInputStream findFirstMatching(String dirname, String[] pathnames, String empId) throws FileNotFoundException {
    for (String pathname : pathnames) {
        if (Pattern.matches(".*" + empId + ".*", pathname)) {
            return new FileInputStream(dirname + "/" + pathname);
        }
    }
    return null;
}
0 голосов
/ 28 мая 2020

Вы не можете использовать регулярное выражение непосредственно для FileInputStream. Однако вы можете прочитать все файлы, а затем отфильтровать необходимые, как показано ниже. Если в вашем случае можно прочитать все,

File folder = new File( "/user/folder/" ); // Base folder where you have all the files
List<File> collectedFiles = Arrays.stream( folder.listFiles() )
                                  .filter( file -> file.getName().contains( "1525" ) ) // Check if filename as your employee number
                                  .collect( Collectors.toList() ); // Get all the filtered files as a list

Другой подход - использовать FileNameFilter

FilenameFilter filter = ( dir, name ) -> name.contains( "1525" );
File folder = new File( "/user/folder/" ); // Base folder where you have all the files
List<File> collectedFiles = Arrays.stream( folder.listFiles(filter) )
                                  .collect( Collectors.toList() );
0 голосов
/ 28 мая 2020

Попробуйте найти нужный файл, набрав Files.walk(...):

var nameRegEx = ".*" + epid + ".*.jpd";
Optional<Path> path = Files.walk(Paths.get("C:\\xampp\\img\\"))
            .filter(Files::isRegularFile)
            .filter(p -> p.toFile().getName().matches(nameRegEx))
            .findFirst();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...