Как сгруппировать похожие файлы, используя apache camel - PullRequest
0 голосов
/ 02 августа 2020

Я создал программу для упорядочивания файлов в папке в зависимости от их типа. Я написал следующий код, и он нормально работает с небольшими файлами: -

 public static void main(String[] args) {
    CamelContext context= new DefaultCamelContext();

    try{
        context.addRoutes(new RouteBuilder() {
            @Override
            public void configure() throws Exception {
                Scanner sc = new Scanner(System.in);
                System.out.println("Enter the path :");
                String path = sc.next();
                System.out.println(path);
                from("file:"+path+"?noop=true")
                        .log("The header is ${headers} amd body is ${body}")
                        .choice()
                        .when(header("CamelFileNameConsumed").endsWith(".html"))
                        .to("file:"+path+"\\Arranged Files\\HTML files")
                        .when(header("CamelFileNameConsumed").endsWith(".txt"))
                        .to("file:"+path+"\\Arranged Files\\Text Files")
                        .when(header("CamelFileNameConsumed").endsWith(".cpp"))
                        .to("file:"+path+"\\Arranged Files\\Codes")
                        .when(header("CamelFileNameConsumed").endsWith(".py"))
                        .to("file:"+path+"\\Arranged Files\\Codes")
                        .when(header("CamelFileNameConsumed").endsWith(".java"))
                        .to("file:"+path+"\\Arranged Files\\Codes")
                        .when(header("CamelFileNameConsumed").endsWith(".xlsx"))
                        .to("file:"+path+"\\Arranged Files\\Excel Files")
                        .when(header("CamelFileNameConsumed").endsWith(".pdf"))
                        .to("file:"+path+"\\Arranged Files\\PDF files")
                        .when(header("CamelFileNameConsumed").endsWith(".docx"))
                        .to("file:"+path+"\\Arranged Files\\Word Doc files")
                        .when(header("CamelFileNameConsumed").endsWith(".zip"))
                        .to("file:"+path+"\\Arranged Files\\Compressed files")
                        .when(header("CamelFileNameConsumed").endsWith(".rar"))
                        .to("file:"+path+"\\Arranged Files\\Compressed files")
                        .when(header("CamelFileNameConsumed").endsWith(".PNG"))
                        .to("file:"+path+"\\Arranged Files\\Images")
                        .when(header("CamelFileNameConsumed").endsWith(".JPG"))
                        .to("file:"+path+"\\Arranged Files\\Images")
                        .when(header("CamelFileNameConsumed").endsWith(".JPEG"))
                        .to("file:"+path+"\\Arranged Files\\Images")
                        .when(header("CamelFileNameConsumed").endsWith(".gif"))
                        .to("file:"+path+"\\Arranged Files\\Images")
                        .when(header("CamelFileNameConsumed").endsWith(".mkv"))
                        .to("file:"+path+"\\Arranged Files\\Videos")
                        .when(header("CamelFileNameConsumed").endsWith(".mp4"))
                        .to("file:"+path+"\\Arranged Files\\Videos")
                        .otherwise()
                        .to("file:"+path+"\\Arranged Files\\Other files")
                        .end();
            }
        });

        context.start();
        Thread.sleep(600000);
        context.stop();

    }catch(Exception e){
        System.out.println("Exception : " + e);
    }

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

1 Ответ

0 голосов
/ 23 августа 2020

Я могу использовать предикаторы для замены расширений и заголовков файлов.

FileExtensionPredicator. java

public class FileExtensionPredicator implements Predicate {

    private String fileName;

    public FileExtensionPredicator(String fileName) {
        this.fileName = fileName;
    }

    @Override
    public boolean matches(Exchange exchange) {

        String body = exchange.getIn().getBody(String.class);

        String recordLayoutNumber = body.split(".");

        return recordLayoutNumber.equals(fileName);
    }
}

Вы можете применить Predicator как это:

 FileExtensionPredicator isXml = new FileExtensionPredicator(".xml");

  from("file:?noop=true")
        .log("The header is ${headers} amd body is ${body}")                     
        .choice()
        .when(header("CamelFileNameConsumed").endsWith(isXml))
        .to("file:"+{Try another predicator here}")
        .end();
...