第二个文件名中的timstamp字符串对目录中的文件进行排序 -

时间:2017-03-17 06:39:35

标签: java file sorting arraylist directory

我试图通过unix时间戳对目录中的文件进行排序。以下是目录中的文件名。

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

我需要在第二次排序unix时间戳之后获取文件 - 。我怎么能在java中做到这一点?

我可以在python中执行此操作,如下所示

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]

2 个答案:

答案 0 :(得分:2)

一种非常直接的方法:

List<String> fileNames = ... ;

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

sorted电话值得一些解释:

它会创建一个Comparator,用于比较Long个值(Comparator<Long>)。它通过将fileName字符串拆分为由Long分隔的部分来获取-值。然后它获取结果分割的第三个元素,其中包含一个数字。然后它将此数字转换为长数。

答案 1 :(得分:1)

您可以使用自定义比较器对所有文件进行排序,您可以在此处解析时间戳并比较文件的时间戳。最简单的方法是:

    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;
}

如果你有很多文件并且你不想每次都解析时间戳,你可以将每个文件保存到以下记录中:

    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;
}