【问题标题】:How to wait for a file with only fixed "*.txt" extension?如何等待仅具有固定“*.txt”扩展名的文件?
【发布时间】:2016-01-29 11:01:04
【问题描述】:

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

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

还有什么我尝试过的: Java: Find .txt files in specified folder 但在我看来,有一种更好的方法可以将不同的解决方案应用于我的案例。

代码:

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

【问题讨论】:

  • 这就是 WatchService 的用途。但是无论您选择哪种方法,您都需要更加聪明,因为文件的存在并不意味着它的内容已经完全写入。
  • @biziclop 那么如何处理这个问题呢?
  • 很难。如果您可以控制写入文件的系统,则解决方案是将它们作为临时文件写入(到同一位置),最后一步将其重命名为something.txt。但是,如果您无法控制作者,则需要跟踪文件的最后修改日期,并且只选择那些已经停止修改的文件,比如说 5 秒前。
  • @biziclop 我无法控制作者。正如我之前写的那样,外部进程正在创建此文件,完成后将其复制到我的目录中。您对检查修改的建议似乎是防止问题的最佳解决方案。谢谢!

标签: java regex file


【解决方案1】:

我建议使用 java.nio.file 的 WatchService:https://docs.oracle.com/javase/tutorial/essential/io/notification.html

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

【讨论】:

    【解决方案2】:

    创建您自己的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;
      }
    }
    

    SOURCE

    【讨论】:

    • 您的答案看起来非常好,而且运行良好!我添加了一行来获取这个特定的文件名。非常感谢:)
    【解决方案3】:
    File f = new File("C:\\Test\\strangeName.txt");
    
    1. 获取文件名:

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

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

    【讨论】:

    • @Downvoter:你能解释一下为什么对此投反对票吗?
    • 这是我在项目中成功使用的
    【解决方案4】:

    另一种解决方案:

    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");
    

    【讨论】:

      【解决方案5】:

      最简单的解决方案:

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

      【讨论】:

        猜你喜欢
        • 2012-05-22
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-04-26
        • 1970-01-01
        • 2012-05-23
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多