Обновление параметра в SwingWorker

Нужна помощь, делаю программу типа файлового менеджера. В моей программе мне нужно делать одновременные копии файлов. Для этого я использую SwingWorker, чтобы увидеть ход копирования в JProgressbar, но мне нужно знать, как добавить больше файлов для копирования в задаче с тем же назначением.

Это мой класс, который простирается от Swingworker в моей основной программе. Я выберу несколько файлов или папок для копирования в одно место назначения. Что мне нужно, так это то, что пока работает Copytask, я могу добавить больше файлов в Copyitem Arraylist.

Пожалуйста, помогите и извините за мой английский.

import java.awt.Dimension;
import java.awt.Toolkit;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.util.ArrayList;
import java.util.List;
import javax.swing.JDialog;
import javax.swing.JOptionPane;
import javax.swing.JProgressBar;
import javax.swing.SwingWorker;
import xray.XRAYView;


public class CopyTask extends SwingWorker<Void, Integer>
    {

        ArrayList<CopyItem>copia;
        private long totalBytes = 0L;
        private long copiedBytes = 0L;
        JProgressBar progressAll;
        JProgressBar progressCurrent;
        boolean override=true;
        boolean overrideall=false;


        public CopyTask(ArrayList<CopyItem>copia,JProgressBar progressAll,JProgressBar progressCurrent)
        {

            this.copia=copia;
            this.progressAll=progressAll;
            this.progressCurrent=progressCurrent;


            progressAll.setValue(0);
            progressCurrent.setValue(0);
            totalBytes=retrieveTotalBytes(copia);

        }

        public void AgregarCopia(ArrayList<CopyItem>addcopia)throws Exception{

          copia.addAll(copia.size(), addcopia);
          totalBytes=retrieveTotalBytes(addcopia)+totalBytes;
          System.out.println("AL AGREGAR: "+copia.size()+" Tamaño"+totalBytes);



        }

        public File getDriveDest(){
        File dest=new File(copia.get(0).getOrigen().getPath().split("\\")[0]);
        return dest;
        }


        @Override
        public Void doInBackground() throws Exception
        {


            for(CopyItem cop:copia){

             File ori=cop.getOrigen();
             File des=new File(cop.getDestino().getPath());
             if(!des.exists()){
              des.mkdirs();
             }
             if(!overrideall){
             override =true;
             }
             File para=new File(cop.getDestino().getPath()+"\\"+ori.getName());
             copyFiles(ori, para);

            }
            return null;
        }

        @Override
        public void process(List<Integer> chunks)
        {
            for(int i : chunks)
            {
                progressCurrent.setValue(i);


            }
        }

        @Override
        public void done()
        {
            setProgress(100);

        }

        private long retrieveTotalBytes(ArrayList<CopyItem>fich)
        {
           long size=0;
            for(CopyItem cop: fich)
            {
                size += cop.getOrigen().length();

            }

            return size;
        }






private void copyFiles(File sourceFile, File targetFile) throws IOException

         {
                    if(overrideall==false){
                      if(targetFile.exists() && !targetFile.isDirectory()){

                          String []options={"Si a Todos","Si","No a Ninguno","No"};
                          int seleccion=JOptionPane.showOptionDialog(null, "El fichero \n"+targetFile+" \n se encuentra en el equipo, \n¿Desea sobreescribirlo?", "Colisión de ficheros", JOptionPane.DEFAULT_OPTION, JOptionPane.WARNING_MESSAGE, null, options, null);

                          switch(seleccion){
                              case 0:
                              override=true;
                              overrideall=true;
                              break;
                              case 1:
                              override=true;
                              overrideall=false;
                              break;
                              case 2:
                              override =false;
                              overrideall=true;
                              break;
                              case 3:
                              override =false;
                              overrideall=false;
                              break;

                          }

                      }

                    }

                    if(override || !targetFile.exists()){
                    FileInputStream LeeOrigen= new FileInputStream(sourceFile);

                    OutputStream Salida = new FileOutputStream(targetFile);

                    byte[] buffer = new byte[1024];
                    int tamaño;

                    long fileBytes = sourceFile.length();

                    long totalBytesCopied = 0; 

                    while ((tamaño = LeeOrigen.read(buffer)) > 0) {

                    Salida.write(buffer, 0, tamaño);

                     totalBytesCopied += tamaño;
                     copiedBytes+= tamaño;

                     setProgress((int)Math.round(((double)copiedBytes++ / (double)totalBytes) * 100));

                     int progress = (int)Math.round(((double)totalBytesCopied / (double)fileBytes) * 100);

                     publish(progress);



                    }


                    Salida.close();
                    LeeOrigen.close();



                publish(100);
                }


            }
        }

Вот класс CopyItem

import java.io.File;


public class CopyItem {
    File origen;
    File destino;
    String root;

    public CopyItem(File origen, File destino) {
        this.origen = origen;
        this.destino = destino;
    }

    public CopyItem(File origen, File destino, String root) {
        this.origen = origen;
        this.destino = destino;
        this.root = root;
    }

    public String getRoot() {
        return root;
    }

    public void setRoot(String root) {
        this.root = root;
    }


    public File getOrigen() {
        return origen;
    }

    public void setOrigen(File origen) {
        this.origen = origen;
    }

    public File getDestino() {
        return destino;
    }

    public void setDestino(File destino) {
        this.destino = destino;
    }

    @Override
    public String toString() {
        return super.toString(); //To change body of generated methods, choose Tools | Templates.
    }


}

person Michel Guerrero    schedule 19.01.2017    source источник
comment
Я полагаю, что 95% этого кода не имеют отношения к вашему вопросу. Создайте минимальный, полный и поддающийся проверке пример, демонстрирующий вашу проблему.   -  person Joe C    schedule 20.01.2017


Ответы (1)


да, вы можете добавить файлы непосредственно в исходный список (список содержит файлы для копирования), но вам необходимо синхронизировать свой код, потому что добавление большего количества файлов будет в другом потоке (поток пользовательского интерфейса), другой способ - реализовать (производство/потребитель) используя BlockingQueue

Выполняется запуск потребительского класса в отдельных файлах копирования Thread или Swingworker. Класс производителя запускает поток пользовательского интерфейса (выбирая больше файлов).

оба должны иметь доступ к BlockingQueue (содержит файлы для копирования) (конечно, реализации BlockingQueue являются потокобезопасными на основе документации. Преимущество заключается в блокировке выполнения и ожидании добавления файлов, это очень полезно, если вы не знаю когда файлы добавляются )

Я предпочитаю использовать пул потоков для управления выполнением потоков (необязательно).

person Amjad Abdul-Ghani    schedule 19.01.2017
comment
Большое спасибо, Амджад, я слышал о (производстве/потреблении), но я не знаю, как реализовать это в данном случае, я думаю, что идея заключается в том, чтобы одна угроза прослушивала новые файлы добавления, которые отправляли другую угрозу для копирования, но я не знаю, как отправить копию и подождать, пока копия не закончится, чтобы отправить другое, заранее спасибо. - person Michel Guerrero; 20.01.2017