【发布时间】: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 我无法控制作者。正如我之前写的那样,外部进程正在创建此文件,完成后将其复制到我的目录中。您对检查修改的建议似乎是防止问题的最佳解决方案。谢谢!