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