我正在尝试按日期过滤文件

时间:2019-04-19 12:21:00

标签: java file date gz

我正在尝试按日期过滤文件并读取每个文件。我有一个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的文件

3 个答案:

答案 0 :(得分:3)

如果我们从另一个角度看问题,实现您想要的目标似乎非常简单。我将给出基本逻辑。

  1. 从目录读取文件名。 here是示例操作方法
  2. 将名称存储在ArrayList中
  3. 使用集合following链接对ArrayList进行排序有助于您
  4. 现在,无论何时需要访问,您都已对目录的文件名进行了排序,只需访问ArrayList元素并使用它访问实际文件即可

快乐编码,如果仍有问题,请告诉我

答案 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)

从不使用可怕的DateDateFormatSimpleDateFormat类。仅使用 java.time 类。

Answer by Rishoban看起来正确。再加上对解析日期的讨论。

通过调用File来询问每个File::isFile对象代表一个文件还是一个目录。调用File::getName以产生带有文件名文本的String。然后使用String::startsWithString::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格式。

您的问题实际上是许多其他问题的重复。发布前搜索堆栈溢出。