RESOLVIDO: JProgressBar ao transferir arquivos de uma pasta para outra (FileChannel)

Pessoal, tenho um método que pega um arquivo .jar de uma pasta da rede e substitui na pasta raiz da máquina em execução, porém acredito que por estar na rede e pelo arquivo ter de 30 a 50mb está demorando cerca de 2 a 5 minutos a finalização da transferência.

Gostaria de implementar um JProgressBar que mostre ao usuário que a transferência está acontecendo (0 -> Tamanho do arquivo) e que é pra ele esperar e não para que ele não pense que o sistema esteja travado.

Podem me ajudar a implementar esse JProgressBar, abaixo metodos:

//Método que copia e substitui o arquivo jar
    public static void copyFile(File source, File destination) throws IOException {
        if (destination.exists()) {
            destination.delete();
        }
        FileChannel sourceChannel = null;
        FileChannel destinationChannel = null;
        try {
            sourceChannel = new FileInputStream(source).getChannel();
            destinationChannel = new FileOutputStream(destination).getChannel();
            sourceChannel.transferTo(0, sourceChannel.size(), destinationChannel);
        } finally {
            if (sourceChannel != null && sourceChannel.isOpen()) {
                sourceChannel.close();
            }
            if (destinationChannel != null && destinationChannel.isOpen()) {
                destinationChannel.close();
            }
        }
    }

Aqui na inicialização do formulário chamo o método acima, acredito que deva ser aqui a implementação do JProgressBar:

public formUpdate() {
        initComponents();
        carregaVersao();

        System.out.println("Começou");
        worker = new SwingWorker() {
            @Override
            protected Object doInBackground() throws Exception {
                try {
                    //Thread.sleep(5000);
                    File source = new File(ORIGEM);
                    File destination = new File(APP_PATCH + "\\PCP.jar");
                    copyFile(source, destination);
                } catch (IOException ex) {
                    Logger.getLogger(formUpdate.class.getName()).log(Level.SEVERE, null, ex);
                }
                return null;
            }

            @Override
            public void done() {
                try {
                    System.out.println("Finalizou a atualização");
                    java.awt.Desktop.getDesktop().open(new File(APP_PATCH + "\\PCP.jar"));//Abre o Updater
                    worker.cancel(true);
                    System.exit(0);
                } catch (IOException ex) {
                    Logger.getLogger(formUpdate.class.getName()).log(Level.SEVERE, null, ex);
                }
            }
        };
        worker.execute();
    }

Agradecimentos ao google!

Depois de muita pesquisa consegui um código que realmente funcione corretamente e sem gambiarra, anexo para ajudar quem precise:

Método que faz o Download do arquivo e mostra o progresso da transferência num JProgressBar:

public static void copyFile(File source, File destination, JProgressBar barra) throws IOException {
        if (destination.exists()) {
            destination.delete();
        }
        FileChannel sourceChannel = null;
        FileChannel destinationChannel = null;

        long fileSize = source.length();
        long readSeg = fileSize / 100;
        long readRemain = fileSize % 100;

        barra.setValue(0);
        barra.setMinimum(0);
        barra.setMaximum(100);
        barra.setOpaque(false);

        try {
            sourceChannel = new FileInputStream(source).getChannel();
            destinationChannel = new FileOutputStream(destination).getChannel();
            for (int pos = 0; pos < 100; pos++) {
                destinationChannel.transferFrom(sourceChannel, pos * readSeg, readSeg);
                barra.setValue(pos);
                barra.updateUI();
            }
            if (readRemain > 0) {
                destinationChannel.transferFrom(sourceChannel, readSeg * 100, readRemain);
                barra.setValue(100);
            }

        } finally {
            if (sourceChannel != null && sourceChannel.isOpen()) {
                sourceChannel.close();
            }
            if (destinationChannel != null && destinationChannel.isOpen()) {
                destinationChannel.close();
            }
        }
    }

Minha tela de atualização:

1 curtida

Aí sim!!! Boaaaaaa

1 curtida