Как написать асинхронный обработчик файлов в Vertx

Я новичок в Vertex.

Я играю с API и пытаюсь написать FileSizeHandler. Я не знаю, правильный ли это способ сделать это, но я хотел бы услышать ваше мнение.

В моем коде я хотел бы использовать обработчик следующим образом:

    public class MyVerticle extends AbstractVerticle {

            @Override
            public void start() throws Exception {
                getFileSize("./my_file.txt", event -> {
                 if(event.succeeded()){
                       Long result = event.result();
                       System.out.println("FileSize is " + result);
                } else {
                     System.out.println(event.cause().getLocalizedMessage());
                }
        });

     }  

    private void getFileSize(String filepath, Handler<AsyncResult<Long>> resultHandler){
        resultHandler.handle(new FileSizeHandler(filepath));
    }
}

Вот мой класс FileSizeHandler:

public class FileSizeHandler implements AsyncResult<Long> {

    private boolean isSuccess;
    private Throwable cause;
    private Long result;

    public FileSizeHandler(String filePath){
        cause = null;
        isSuccess = false;
        result = 0L;

        try {
            result = Files.size(Paths.get(filePath));
            isSuccess = !isSuccess;
        } catch (IOException e) {
            cause = e;
        }

    }

    @Override
    public Long result() {
        return result;
    }

    @Override
    public Throwable cause() {
        return cause;
    }

    @Override
    public boolean succeeded() {
        return isSuccess;
    }

    @Override
    public boolean failed() {
        return !isSuccess;
    }
}

Что меня беспокоит в обработчике, так это то, что я должен делать это в конструкторе класса. Есть ли лучший способ сделать это?


person Dimitri    schedule 15.08.2016    source источник


Ответы (1)


Во-первых, вы назвали свой класс FileHandler, но это не так. Это результат. Вы объявляете обработчик в Vert.x следующим образом:

public class MyHandler implements Handler<AsyncResult<Long>> {

    @Override
    public void handle(AsyncResult<Long> event) {
        // Do some async code here
    }
}

Теперь, за то, что вы делаете, есть vertx.fileSystem():

public class MyVerticle extends AbstractVerticle {

    @Override
    public void start() throws Exception {

        vertx.fileSystem().readFile("./my_file.txt", (f) -> {
            if (f.succeeded()) {
                System.out.println(f.result().length());
            }
            else {
                f.cause().printStackTrace();
            }
        });
    }
}
person Alexey Soshin    schedule 16.08.2016