我试图通过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]
答案 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;
}