Я борюсь с очень простой проблемой, пожалуйста, посмотрите:

Другой процесс создает файл (только один) с неизвестным именем, но с расширением .txt. Это создание может занять некоторое время, поэтому я написал цикл, который ожидает этот файл и прерывается, когда файл найден. Проблема в том, как передать неизвестное значение в строку? Я полагаю, что это можно сделать с помощью регулярного выражения.

Более того, я пробовал с этим: Java: найти файлы .txt в указанной папке, но, по моему мнению, там - лучший способ применить в моем случае другое решение.

Код:

import java.io.File;

public class Test {

public static void waitForFile() throws InterruptedException{
    while(true){
        File f = new File("C:\\Test\\strangeName.txt");
        if(f.exists()){
            System.out.println("File is available now! End of the program");
            break;
        }
        System.out.println("File still does not exist.");
        Thread.sleep(5000);
    }
}   
public static void main(String[]args) throws InterruptedException{
    waitForFile();  
}
}

Я хотел бы иметь такой код:

File f = new File("C:\\Test\\*.txt");    

Заранее большое спасибо за любые подсказки!

РЕШЕНИЕ ЭТОЙ ПРОБЛЕМЫ

Благодаря @JordiCastilla я создал код ниже. Еще раз, большое спасибо :)

import java.io.File;
import java.io.FileFilter;

class TextFileFilter implements FileFilter{

private String fileExtension = "txt";

@Override
public boolean accept(File file) {
    if(file.getName().toLowerCase().endsWith(fileExtension)){
        return true;
    }
    return false;
}
}

public class Test {

public static String waitForFileAndGetName() throws InterruptedException{

    TextFileFilter tff = new TextFileFilter();
    File f = new File("C:\\Users\\502532974\\Desktop\\Tescior");
    int i = 1;
    while(true){

        File[] files = f.listFiles(tff);
        if(files.length > 0){
            System.out.println("File is available now! End of the program.");
            return f.listFiles(tff)[0].getName();
        }
        System.out.println("File still does not exist. Iteration number "+i);
        Thread.sleep(5000);
        i++;
    }
}


public static void main(String[]args) throws InterruptedException{
    System.out.println("File name is="+waitForFileAndGetName());    
}
}
3
JMK 29 Янв 2016 в 14:01

5 ответов

Лучший ответ

Создайте свой собственный FileFilter:

Если вам нужны ТОЛЬКО *.txt файлы:

public class TextFileFilter implements FileFilter
{
  private final String TXT = "txt";

  public boolean accept(File file)
  {
    if (file.getName().toLowerCase().endsWith(TXT))
      return true;
    else
      return false;
  }
}

Теперь вам просто нужно проверить папку на наличие изменений:

File folder = new File("yourFolder");

while (true) {
    File[] files = folder.listFiles(new TextFileFilter());
    if (files.length > 0) // found;
}

ДОБАВИТЬ:

Если вы хотите проверить расширение файла более * .txt. Будет примерно так:

public class TextFileFilter implements FileFilter
{
  private final String[] okFileExtensions = new String[] {"txt", "doc"};

  public boolean accept(File file)
  {
    for (String extension : okFileExtensions)
    {
      if (file.getName().toLowerCase().endsWith(extension))
      {
        return true;
      }
    }
    return false;
  }
}

ИСТОЧНИК

2
Jordi Castilla 29 Янв 2016 в 11:13

Альтернативное решение:

public static void waitForFile(String fileLocation, String extension) throws InterruptedException {

    List<File> files = Arrays.asList(new File(fileLocation).listFiles());

    int i = 0;
    try {
        while (!files.get(i).getCanonicalPath().endsWith(extension)) {

            i = i == files.size() ? 0 : i + 1;

            Thread.sleep(5000);

        }

        System.out.println(files.get(i).getName());

    } catch (Exception e) {

        Thread.sleep(5000);
        waitForFile(fileLocation, extension);

    }

}

Вызовите этот метод, указав в качестве аргументов расположение файла и желаемое расширение.

 new bbb().waitForFile("C:\\Test\\", ".txt");
0
Chathura Wijeweera 1 Фев 2016 в 06:08
File f = new File("C:\\Test\\strangeName.txt");
  1. Получите имя файла:

    String fileName = f.getName();
    
  2. Затем получите расширение:

    String exte = fileName.substring(fileName.lastIndexOf(".") + 1);
    
0
Tom 29 Янв 2016 в 11:34

Я бы порекомендовал использовать WatchService из java.nio.file: https: // docs.oracle.com/javase/tutorial/essential/io/notification.html

Затем вы можете отфильтровать результат для расширения txt.

3
simdevmon 29 Янв 2016 в 11:06

Самое простое решение:

public static String waitForFileAndGetName() throws InterruptedException{
    FilenameFilter tff = new WildcardFileFilter("*.txt");
    File f = new File("C:\\Users\\502532974\\Desktop\\Tescior");
    File[] files;
    int i = 0;
    while((files = f.listFiles(tff)).length == 0){
        System.out.println("File still does not exist. Iteration number " + ++i);
        Thread.sleep(500);
    }
    System.out.println("File is available now! End of the program.");
    return f.listFiles(tff)[0].getName();
}
0
Adam Silenko 4 Сен 2019 в 17:10