2016-06-13 36 views
0

將文件名模式設置爲YYYYMDD或YYYYMMDD,如下所示。在java中獲取基於文件名模式的最新文件

在目錄中有具有以下模式的文件列表。 必須根據java中的文件名讀取最新的文件。 如何做到這一點?

xxx_2016103 
.... 
xxx_20161104 
+3

你一定要在你的日期,使用佔位符零,例如,它會將'xxx_2016103'更改爲'xxx_20160103'。 – Zircon

回答

0
  1. 創建包含String filename; DateTime date;
  2. 收集在一個List<FileDateWrapper>所有的文件名(離開日期空現在)小班FileDateWrapper
  3. 使用一些日期/時間API像Jodajava.time(Java的8 + )創建兩個日期格式(如您所述)
  4. 檢查列表,剝離_字符(.split()),然後嘗試解析生成的字符串th格式(例如。使用parseDateTime(String)。存儲被成功地在你的FileDateWrapper
  5. 現場解析之日起實施ComparatorComparable和排序您的FileDateWrapper(或Collections.max)名單
1

最好的辦法是取日期,它們映射到文件,讓TreeMap對象實現SortedMap這樣的事實,所以他們有秩序的爲你做的工作。

Map<Date,File> filedatemap = new TreeMap<Date,File>(); 
for(File f : inputdir.listFiles()) { //Assumption: inputdir is a File object pointing to the target directory. 
    String filename = f.getName(); 
    DateFormat df = new SimpleDateFormat("YYYYMMdd"); 
    Date filedate = df.parse(filename, new ParsePosition(filename.getLastIndexOf('_')); 
    filedatemap.put(filedate,f); 
} 

File latestfile = filedatemap.lastEntry().getValue(); //Last entry because natural order of Date is chronological. 
//Go do things with that file 

爲了達到最佳效果,採取鋯石的評論對心臟和墊的單數月份/天0,使得SimpleDateFormat的將正確解析。

+0

我會創建一個普通地圖(Hashmap),然後在for循環之後從結果中創建一個樹形圖,因爲在樹形圖中添加條目比在散列圖中要慢。 –

+0

好答案。僅供參考,麻煩的'Date'&'SimpleDateFormat'類現在已經過時,取而代之的是java.time類。改爲使用LocalDate和DateTimeFormatter(https://docs.oracle.com/javase/8/docs/api/java/time/format/DateTimeFormatter.html)。 –

0

如果您的文件名在列表中,您可以創建一個自定義比較器來根據文件名中的日期對列表進行排序。在Java中8

Collections.sort(fileNamesList, new FilenamesWithDateSuffixComparator()); 

或者用列表的簡短方法:

public class FilenamesWithDateSuffixComparator implements Comparator<String> { 

    private static final int ONE_DIGIT_MONTH_FORMAT = "yyyyMdd".length(); 

     @Override 
     public int compare(String o1, String o2) { 
     String date1 = o1.substring(o1.lastIndexOf("_") + 1); 
     String date2 = o2.substring(o2.lastIndexOf("_") + 1); 
     // If the dates only have one digit for the month, insert a zero. 
     if (date1.length() == ONE_DIGIT_MONTH_FORMAT) { 
      date1 = date1.substring(0, 4) + "0" + date1.substring(5); 
     } 
     if (date2.length() == ONE_DIGIT_MONTH_FORMAT) { 
      date2 = date2.substring(0, 4) + "0" + date2.substring(5); 
     }  
     return date1.compareTo(date2); 
    } 
} 

然後,您可以使用比較排序列表

fileNamesList.sort(new FilenamesWithDateSuffixComparator());