检查是否存在与模式匹配的文件

时间:2011-11-14 15:17:24

标签: java file

如何根据Java中的部分文件名检查文件是否存在?

在我的情况下,应该每天创建一个文件,其名称格式为DATE_TIMESTAMP.xml,然后应附加到。

例如:2011-14-11_1734289.xml

因此,如果名称以2011-14-11(今天是2011-14-11)开头的文件存在,则应附加该文件,否则应创建新文件。

可以File.exist()传递正则表达式吗?是否有任何库提供此功能?

5 个答案:

答案 0 :(得分:3)

首先确保您有一个File对象指向可能需要创建此文件的目录。之后,您可以在其上拨打listFiles(FilenameFilter filter)。如果它返回的长度不是0的数组,则表示存在至少一个名称部分匹配的文件。您还可以使用它来检测不正确的情况(例如,长度大于1的数组意味着名称中包含太多文件)。

要使用此功能,您必须创建FilenameFilter的实现。确保它有一个构造函数,您可以在其中传递需要检查的部分名称或模式。可能没有必要使用正则表达式,只需检查文件名中是否包含所需格式的当前日期就足够了。

或者,如果可能存在名称中包含日期的目录,则可以使用listFiles(FileFilter filter)实现FileFilter而不是FilenameFilter。使用File的方法File,获取单个isDirectory()实例进行检查而不是File目录加上文件名可以使这更容易。

答案 1 :(得分:0)

如果打开要写入的文件名,Java会在它不存在的情况下创建它,并且如果它存在则会附加(除非你专门标记覆盖,在这种情况下它会覆盖)。

因此,打开一个简单的FileWriter或FileOutputStream就可以了。

答案 2 :(得分:0)

使用filereader或bufferedreader可以解决问题。这两个都检查了异常,因此您必须将它们放在try catch块中。在catch块中,如果捕获了FileNotFoundException或IOException,则可以创建该文件。

答案 3 :(得分:0)

您可以使用File类及其方法:

  1. exists()
  2. createNewFile()
  3. 它还有其他方法可以提供帮助。

    <强>更新

    您可能希望使用listFiles()方法。

      

    返回:       一组抽象路径名,表示此抽象路径名表示的目录中的文件和目录。如果目录为空,则数组将为空。

答案 4 :(得分:0)

根据您的具体要求,有几种可行的方法可以解决您想要做的事情。

  1. 使用Files.newDirectoryStream(Path, String)

    Java 7的nio实用程序包含一个允许您对glob进行过滤的方法,这样可以让您完全按照要求匹配部分文件名。 FilesPath类在概念上与遗留File类略有不同,但它们更强大,更强大。如果您使用的是Java 7+,我建议您在新代码中使用Path。存在性检查看起来像这样:

    try (DirectoryStream<Path> stream = Files.newDirectoryStream(dir, "2011-14-11*")) {
      Iterator<Path> streamIter = stream.iterator();
      if(streamIter.hasNext()) {
        System.out.println("File exists: "+streamIter.next());
        if(streamIter.hasNext()) {
          throw new IllegalStateException("Multiple filenames matched the glob!");
        }
      } else {
        System.out.println("File does not exist");
      }
    }
    

    上面的模式仍然有点容易出错,我们真正应该做的是定义一个返回Path对象并隐藏文件查找行为的方法。考虑:

    public Path getDatedFile(String date) {
      try (DirectoryStream<Path> stream = Files.newDirectoryStream(dir, date+"*")) {
        Iterator<Path> streamIter = stream.iterator();
        if(streamIter.hasNext()) {
          Path file = streamIter.next();
          if(streamIter.hasNext()) {
            throw new IllegalStateException("Multiple filenames matched the glob!");
          }
          return file;
        } else {
          Path file = dir.resolve(date+"_"+getTimestamp()+".xml");
          Files.createFile(file); // or write some sort of header here
          return file;
        }
      }
    }
    

    使用此方法意味着您的所有代码都可以简单地调用此方法,并且所有调用方都可以信任该文件存在。请注意,如果您不使用Java 7,则可以使用File实现等效方法。

  2. 避免使用此命名方案

    但实际上,您遇到了麻烦,因为您不知道创建文件的实际名称(如果已存在)。为什么需要使用无法预测的命名方案?由于您每天只需要一个文件,DATE.xml出了什么问题?使用这种更复杂的命名方案可以解决各种错误和额外的复杂性,因为使用该文件的每一段代码现在都需要手动检查类似的文件名,而不是简单地存在已知名称的文件。听起来,一目了然,就像TIMESTAMP只是记录文件创建时 - 为什么不把这些数据放在文件本身? E.g:

    2011-14-11.xml:
      <root created="1734289">
        ...