如何根据Java中的部分文件名检查文件是否存在?
在我的情况下,应该每天创建一个文件,其名称格式为DATE_TIMESTAMP.xml
,然后应附加到。
例如:2011-14-11_1734289.xml
因此,如果名称以2011-14-11
(今天是2011-14-11)开头的文件存在,则应附加该文件,否则应创建新文件。
可以File.exist()
传递正则表达式吗?是否有任何库提供此功能?
答案 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
类及其方法:
它还有其他方法可以提供帮助。
<强>更新强>:
您可能希望使用listFiles()
方法。
返回: 一组抽象路径名,表示此抽象路径名表示的目录中的文件和目录。如果目录为空,则数组将为空。
答案 4 :(得分:0)
根据您的具体要求,有几种可行的方法可以解决您想要做的事情。
使用Files.newDirectoryStream(Path, String)
Java 7的nio
实用程序包含一个允许您对glob进行过滤的方法,这样可以让您完全按照要求匹配部分文件名。 Files
和Path
类在概念上与遗留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
实现等效方法。
避免使用此命名方案
但实际上,您遇到了麻烦,因为您不知道创建文件的实际名称(如果已存在)。为什么需要使用无法预测的命名方案?由于您每天只需要一个文件,DATE.xml
出了什么问题?使用这种更复杂的命名方案可以解决各种错误和额外的复杂性,因为使用该文件的每一段代码现在都需要手动检查类似的文件名,而不是简单地存在已知名称的文件。听起来,一目了然,就像TIMESTAMP
只是记录文件创建时 - 为什么不把这些数据放在文件本身? E.g:
2011-14-11.xml:
<root created="1734289">
...