как сортировать файлы при обработке в Java - PullRequest
0 голосов
/ 21 января 2020

Я новичок в Java и во время обработки обнаружил, что файлы были обработаны случайным образом без какого-либо порядка.

Я хочу отсортировать файлы по дате, чтобы они могли обрабатываться последовательно. В java было немного функций, которые могут это сделать, но я не знаю точно, где мне нужно это разместить.

public class OMapping extends AbstractWorkflow {
    private final static Logger LOG = LoggerFactory.getLogger(OMapping.class);
    private WorkflowEnvironment workflowEnvironment;

    @Override
    public boolean run(CommandLine commandLine) throws Exception {
        AnnotationConfigApplicationContext applicationContext = initializeApplicationContext();

        String in = commandLine.getOptionValue("in");
        String done = commandLine.getOptionValue("doneDir");
        if (in == null) {
            LOG.error("The input directory has not been specified");
            return false;
        }
        if(done == null){
             LOG.error("The done directory has not been specified");
            return false;
        }

        Path indir = Paths.get(in);
        Path doneDir = Paths.get(done);
        MappingFileImporter oMappingFileImporter = applicationContext.getBean(oMappingFileImporter.class);

        LOG.info("Importing files from " + in);
        Files.walk(indir, 1, FileVisitOption.FOLLOW_LINKS)
                .filter(Files::isRegularFile)
                .filter(f -> f.getFileName().toString().matches("OFFENE_LIEFERORDERS.*\\.csv"))
                .forEach(f -> {
                    try {
                        oMappingFileImporter.importFile(f);
                        Path moved = Files.move(f.toAbsolutePath(), doneDir.resolve(f.getFileName()), StandardCopyOption.REPLACE_EXISTING);
                    } catch (IOException ex) {
                        throw new UncheckedIOException(ex);
                    }
                });
        return true;
    }

    @Override
    public String getName() {
        return "orderidmappingimporter";
    }

    @Override
    public void addOptions(Options options) {
        options.addOption(null, "in", true,
                "(orderidmappingimporter) specifies the input directory");
        options.addOption(null, "doneDir", true,
                "(orderidmappingimporter) specifies the done directory");
    }   

}

Ответы [ 2 ]

1 голос
/ 21 января 2020

Метод Files.walk возвращает поток пути (см. Документы ), и вы можете вызывать «отсортированный» метод, реализуя свой собственный компаратор, который позволяет сортировать поток на основе любого атрибута, который вы хотите.

Вы можете сделать что-то подобное, если хотите отсортировать файлы по дате создания:

Files.walk(indir, 1, FileVisitOption.FOLLOW_LINKS)
 .sorted(
        new Comparator<Path>() {
            public int compare(Path p1, Path p2) {
                return Files.readAttributes(p1, BasicFileAttributes.class).creationTime().toMillis() -
                            Files.readAttributes(p2, BasicFileAttributes.class).creationTime().toMillis();
            }
        }
     )
    .filter(Files::isRegularFile)
    .filter(f -> f.getFileName().toString().matches("OFFENE_LIEFERORDERS.*\\.csv"))
    .forEachOrdered(f -> {
        try {
            oMappingFileImporter.importFile(f);
            Path moved = Files.move(f.toAbsolutePath(), doneDir.resolve(f.getFileName()), StandardCopyOption.REPLACE_EXISTING);
        } catch (IOException ex) {
            throw new UncheckedIOException(ex);
        }
    });

При этом используется класс java .nio.file.attribute.BasicFileAttributes, поэтому вы должны импортировать это в начало вашего файла.

1 голос
/ 21 января 2020

Вы хотите отсортировать эти файлы по дате. Метод Files.walk() вернет Stream<Path>, и он будет отсортирован по имени, а не по дате, у него даже нет даты, поскольку значения являются путями. Вы можете использовать метод .sorted() с компаратором для сортировки после последнего изменения:

            Files.walk(indir, 1, FileVisitOption.FOLLOW_LINKS)
                .sorted(Comparator.comparingLong(p -> p.toFile().lastModified()))
                .forEachOrdered(System.out::println);

При этом используется класс Comparator для сравнения длинного значения, возвращаемого .lastModified().

https://docs.oracle.com/javase/8/docs/api/java/util/Comparator.html

https://docs.oracle.com/javase/8/docs/api/java/util/stream/Stream.html#sorted -

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...