2017-03-17 3 views
0

유닉스 타임 스탬프로 디렉토리에서 파일을 정렬하려고합니다. 다음은 디렉토리의 파일 이름입니다.두 번째 이후의 파일 이름에 timstamp 문자열로 파일 정렬 -

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

두 번째 이후에 유닉스 타임 스탬프를 정렬 한 후에 파일을 가져와야합니다. 어떻게 내가 자바에서 그렇게 할 수 있을까? 내가 좋아하는 파이썬에서 그렇게 할 수 있어요

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

매우 직접적인 방법은 아래 :

그것은 비교하는 Comparator를 만듭니다

List<String> fileNames = ... ; 

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

sorted 전화가 몇 가지 설명을받을 권리가 Long 값 (Comparator<Long>). fileName 문자열을 -으로 구분 된 부분으로 나누어 Long 값을 가져옵니다. 그런 다음 결과 스플릿의 세 번째 요소 (숫자가 있음)를 사용합니다. 그런 다음이 숫자를 long으로 변환합니다.

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