Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何等待只有固定“*”的文件。txt";分机?_Java_Regex_File - Fatal编程技术网

Java 如何等待只有固定“*”的文件。txt";分机?

Java 如何等待只有固定“*”的文件。txt";分机?,java,regex,file,Java,Regex,File,我正在努力解决一个非常基本的问题,请看一下: 其他一些进程创建一个名未知但扩展名为.txt的文件(只有一个)。这个创建过程可能需要一段时间,因此我编写了一个循环,等待这个文件,当找到该文件时,它会中断。 问题是-如何将未知值传递给字符串? 我想可以用正则表达式来实现 此外,我还尝试了以下方法: 但在我看来,有一种更好的方法可以将不同的解决方案应用到我的案例中 代码: 我希望有一个这样运行的代码: File f = new File("C:\\Test\\*.txt"); public

我正在努力解决一个非常基本的问题,请看一下:

其他一些进程创建一个名未知但扩展名为.txt的文件(只有一个)。这个创建过程可能需要一段时间,因此我编写了一个循环,等待这个文件,当找到该文件时,它会中断。 问题是-如何将未知值传递给字符串? 我想可以用正则表达式来实现

此外,我还尝试了以下方法: 但在我看来,有一种更好的方法可以将不同的解决方案应用到我的案例中

代码:

我希望有一个这样运行的代码:

File f = new File("C:\\Test\\*.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;
  }
}
提前感谢您的任何提示

此问题的解决方案

感谢@JordiCastilla,我在下面创建了一个代码。再次非常感谢:)


我建议使用
java.nio.file
中的WatchService:


然后,您可以过滤txt扩展名的结果

创建自己的
文件过滤器

如果您只需要
*.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文件扩展名。将是这样的:

File f = new File("C:\\Test\\*.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;
  }
}
  • 获取文件名:

    String fileName = f.getName();
    
  • 然后获取扩展名:

    String exte = fileName.substring(fileName.lastIndexOf(".") + 1);
    

  • 另一种解决方案:

    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);
    
        }
    
    }
    
    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();
    }
    
    最简单的解决方案:

    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);
    
        }
    
    }
    
    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();
    }
    

    @向下投票人:你能解释一下为什么向下投票吗?这就是我在一个项目中成功使用的方法。你的答案看起来很好,而且效果很好!我添加了一行,它获取这个特定的文件名。非常感谢:)这就是WatchService的用途。但是无论你选择什么方法,你都需要更加聪明,因为文件的存在并不意味着它的内容已经完全写好了。@biziclop那么如何处理这个问题呢?很难。如果您可以控制写入文件的系统,解决方案是将它们作为临时文件写入(到相同的位置),最后一步,将其重命名为
    something.txt
    。但是,如果您无法控制写入程序,则需要跟踪文件的上次修改日期,并且只拾取那些已停止修改的文件(比如说5秒钟前)。@biziclop我无法控制写入程序。正如我之前写的,一个外部进程正在创建这个文件,当它完成时,它会将它复制到我的目录中。你的建议与检查修改似乎是最好的解决方案,以防止问题。谢谢