2017-03-17 6 views
0

Ich versuche, die Dateien in einem Verzeichnis nach Unix-Zeitstempel zu sortieren. Es folgt der Dateiname in einem Verzeichnis.Sortieren von Dateien in einem Verzeichnis nach timstamp Zeichenfolge im Dateinamen nach dem zweiten -

20151102-2148040042-1446522484838-Game21500052-x.realtime 
20121102-2148010042-1446522484138-Game21500052-x.realtime 

Ich brauche die Dateien nach dem Sortieren unix Zeitstempel nach dem zweiten -. Wie kann ich das in Java machen?

ich in der Lage bin, dass wie in Python zu tun, unter

def extract_timestamp(filename): 
    timestamp = filename.split('-')[2] 
    return timestamp 
directory = '/home/ubuntu/assdd/' 
# Get all files from the path 
log_files = os.listdir(directory) 

# Sort files by timestamp 
log_files.sort(key=extract_timestamp) 

# Get full path of each file 
files = [os.path.join(directory,data_file) for data_file in log_files] 

Antwort

2

Ein sehr direkten Ansatz:

List<String> fileNames = ... ; 

List<String> sortedFileNames = fileNames.stream() 
    .sorted(Comparator.comparingLong(s -> Long.parseLong(s.split("-")[2]))) 
    .collect(Collectors.toList()); 

Der sorted Anruf eine Erklärung verdient:

Es hat eine Comparator erstellt, vergleicht Long Werte (Comparator<Long>). Er erhält den Wert , indem er den String fileName in Teile aufteilt, die durch - getrennt sind. Es nimmt dann das dritte Element der resultierenden Teilung, die eine Nummer enthält. Es konvertiert dann diese Zahl in eine lange Zahl.

1

Sie können alle Dateien mit einem benutzerdefinierten Vergleicher sortieren, hier können Sie den Zeitstempel analysieren und den Zeitstempel der Datei vergleichen. Der einfachste Weg ist:

private String getTimestamp(File file) { 
    return file.getName().substring(20, 33); 
} 

public List<File> sortFilesInDir(String yourpath) { 
    File folder = new File(yourpath); 
    File[] listOfFiles = folder.listFiles(); 

    if (listOfFiles == null) { 
     return null; 
    } 
    List<File> files = Arrays.asList(listOfFiles); 

    Collections.sort(files, new Comparator<File>() { 
     @Override 
     public int compare(File o1, File o2) { 
      return getTimestamp(o1).compareTo(getTimestamp(o2)); 
     } 
    }); 
    return files; 
} 

Wenn Sie viele Dateien haben, und Sie wollen nicht jedes Mal analysieren zu, Sie jede Datei wie auf einen Datensatz speichern:

private static class FileRecord { 
    private File file; 
    private String timestamp; 

    public FileRecord(File file) { 
     this.file = file; 
     this.timestamp = file.getName().substring(20, 33); 
    } 

    public File getFile() { 
     return file; 
    } 

    public void setFile(File file) { 
     this.file = file; 
    } 

    public String getTimestamp() { 
     return timestamp; 
    } 

    public void setTimestamp(String timestamp) { 
     this.timestamp = timestamp; 
    } 
} 

private List<FileRecord> convertFilesToRecords(File[] files) { 
    List<FileRecord> records = new ArrayList<>(); 
    for (File file : files) { 
     records.add(new FileRecord(file)); 
    } 
    return records; 
} 

public List<File> sortFilesInDir(String yourpath) { 
    File folder = new File(yourpath); 
    List<FileRecord> records = convertFilesToRecords(folder.listFiles()); 

    Collections.sort(records, new Comparator<FileRecord>() { 
     @Override 
     public int compare(FileRecord o1, FileRecord o2) { 
      return o1.getTimestamp().compareTo(o2.getTimestamp()); 
     } 
    }); 
    List<File> files = new ArrayList<>(); 
    for (FileRecord record : records) { 
     files.add(record.getFile()); 
    } 
    return files; 
} 
Verwandte Themen