我正在尝试按日期过滤文件并读取每个文件。我有一个find()方法,该方法读取每个文件名,并返回数组中以“ B”开头的文件。第二种方法filesort(),它将返回从find()方法发送的文件名中的所有文件日期。在主要方法中,我想在指定的日期之前读取文件。如果所有文件具有相同的日期,它将读取所有文件。但是,文件中的一个文件具有不同的日期,它将引发错误。
public static String[] find(String rootPath){
File root = new File(rootPath);
// Filter files whose name start with "B"
FilenameFilter beginswithm = new FilenameFilter() {
public boolean accept(File directory, String filename) {
return filename.startsWith("B");
}
};
// array to store filtered file names
String[] files = root.list(beginswithm);
String[] no = { "nofile" };
if (files == null) {
return no;
}
return files;
}
public String filesort() throws ParseException {
String path = "C:";
String [] filesList = find(path);
for (String file : filesList) {
File st = new File(file);
String name=st.getName();
name= name.replaceAll("\\D+", "");
String Datename = name.substring(0, 8);
DateFormat formatter = new SimpleDateFormat("yyyymmdd");
Date date = (Date)formatter.parse(Datename);
SimpleDateFormat newFormat = new SimpleDateFormat("mm/dd/yyyy");
String finalString = newFormat.format(date);
return finalString;
}
return "error";
}
public static void main(String[] args){
String path = "C:";
String [] filesList = find(path);
for (String file : filesList) {
if(filesort().equals("04/17/2019"))//to read all files that has 04/17/2018
{
reader = new BufferedReader(new InputStreamReader(new GZIPInputStream(new FileInputStream(path + "//" +file))));
String content;
while ((content = reader.readLine()) != null) {
System.out.println(content);
}
}
else if (!filesort().equals("04/17/2019")||filesort()==null ) {
System.out.println("incorect date");
}
}
this are the files I'm trying to read
BProce.Arr.20190416.server10.gz
BProce.Arr.20190417..ball10.gz
BProce.Arr.20190417.ball23.gz
因为第一个文件是04/16/2019,它将引发不正确的日期。如果它们中的3个具有04/17/2019,它将毫无问题地读取。 但现在我只想阅读日期为04/17/2019的文件
答案 0 :(得分:3)
如果我们从另一个角度看问题,实现您想要的目标似乎非常简单。我将给出基本逻辑。
快乐编码,如果仍有问题,请告诉我
答案 1 :(得分:1)
要查找名称以'B'开头且包含特定日期的文件,请按照以下步骤操作。
您可以在File
类中使用此代码查找所有文件。
public File[] find(String path) {
File dir = new File(path);
File[] listOfFiles = null;
if (dir.isDirectory()) {
listOfFiles = dir.listFiles();
}
return fileList;
}
从此文件列表中,您可以获取文件名,然后检查此文件名以“ B”开头,然后 检查是否包含特定日期。字符串对象具有startsWith()方法。您无需将日期字符串更改为Date对象。只需检查文件名是否包含日期字符串即可。
答案 2 :(得分:1)
从不使用可怕的Date
,DateFormat
或SimpleDateFormat
类。仅使用 java.time 类。
Answer by Rishoban看起来正确。再加上对解析日期的讨论。
通过调用File
来询问每个File::isFile
对象代表一个文件还是一个目录。调用File::getName
以产生带有文件名文本的String
。然后使用String::startsWith
和String::substring
分析文件名。拉出可能的日期文本。通过尝试将文本解析为LocalDate
进行验证。定义一个DateTimeFormatter
格式格式以匹配您的预期输入。
LocalDate targetDate = LocalDate.of( 2019 , Month.APRIL , 17 ) ;
DateTimeFormatter f = DateTimeFormatter.ofPattern( "MM/dd/uuuu" ) ;
int lengthOfExpectedDateInput = 10 ; // "01/23/2019" is 10 characters long.
String fileName = file.getName() ;
if( file.isFile() && fileName.startsWith( "B" ) ) {
String possibleDateInput = fileName.substring( 1 , 1 + lengthOfExpectedDateInput ) ; // Annoying zero-based index counting where 1 means the 2nd position.
try {
LocalDate ld = LocalDate.parse( possibleDateInput , f ) ; // Parse string as a `LocalDate` object. If input fails to match formatting pattern, a `DateTimeParseException` is thrown.
if( ld.isEqual( targetDate ) ) {
// Handle a valid file with expected file name.
…
}
} catch ( DateTimeParseException e ) {
// Handle unexpected file name.
…
}
}
顺便教育一下这些ISO 8601标准的文件名。日期应采用YYYY-MM-DD格式。
您的问题实际上是许多其他问题的重复。发布前搜索堆栈溢出。