读取任务中的文件



我是Java和JavaFX的初学者。我有一个问题,我想计算文件夹中的 PDF,我想显示进度条中的进程。

我知道PDF的数量,我必须检查是否都在那里。

读取文件夹的方法是:

private void dir(File fileRoot) {
     File[] files = fileRoot.listFiles();
     for(File file : files) {
         if(file.isDirectory()){
             dir(file);
         }    
         else{
             String dateiName = file.getName();
             if(dateiName.endsWith(".pdf")){
                 ++countPDF;
                 System.out.println(countPDF);              
             }
         }
     }

更新进度条的方法是:

private Task<Boolean> createWorker() {    
    return new Task<Boolean>() {
        @Override
        protected Boolean call() throws Exception {
                    updateMessage(countPDF + "");
                    updateProgress(countPDF, number);
            }
            return true;
        };
    }

如何在控制器中组合?

public class Controller {
    @FXML
    private Button startButton;
    @FXML
    private ProgressBar myProzessBar;
    @FXML
    private Label label;
    private int countPDF;
    private File directory;
    @FXML
    private void actionStart(ActionEvent event) {  
        String path = "C:\root\";
        directory = new File(path);    
        myProzessBar.progressProperty().unbind();        
        myProzessBar.progressProperty().bind(task.progressProperty());
        label.textProperty().bind(task.messageProperty());
    }
    @FXML
    void initialize() {
    }

我尝试了几天来解决这个问题,现在我没有更多的想法。

请帮助我。

你可以这样做:

private Path directory;
.....        
private Task<ObservableList<Integer>> createWorker() {
    return new Task<ObservableList<Integer>>() {
        @Override
        protected ObservableList<Integer> call() throws Exception {
            Stack<Path> stack = new Stack();
            stack.push(directory);
            int i = 0;
            while (!stack.empty()) {
                if (isCancelled()) {
                    break;
                }
                Path root = stack.pop();
                try (DirectoryStream<Path> stream = Files.newDirectoryStream(root);) {
                    for (Path path : stream) {
                        if (Files.isDirectory(path)) {
                            stack.push(path);
                        } else {
                            if (path.toString().endsWith(".pdf")) {
                                i++;
                                results.add(i);
                                updateProgress(i, 100);
                                updateValue(results);
                                Thread.sleep(5);
                            }
                        }
                    }
                } catch (IOException ex) {
                    System.out.println(ex.getMessage());
                }
            }
            return results;
        }
    };
}

有了这个,我可以读取根文件夹,但不能读取子文件夹。这很容易。

但是我必须可以读取根文件夹和子文件夹。

这是代码:

import java.io.File;
import javafx.concurrent.Task;
import javafx.concurrent.WorkerStateEvent;
import javafx.event.ActionEvent;
import javafx.event.EventHandler;
import javafx.fxml.FXML;
import javafx.scene.control.Button;
import javafx.scene.control.Label;
import javafx.scene.control.ProgressBar;
public class Controller {
    @FXML
    private Button startButton;
    @FXML
    private ProgressBar myProzessBar;
    @FXML
    private Label label;

private Task<Boolean> myWorker;
private int countPDF;
private File directory;
@FXML
private void actionStart(ActionEvent event) {  
    String path = "C:\root\";
    directory = new File(path);
    if(!directory.isDirectory())
        return;
    countPDF = 0;
    myWorker = createWorker(directory);
    myWorker.setOnSucceeded(new EventHandler<WorkerStateEvent>() {
        @Override
        public void handle(WorkerStateEvent event) {
            startButton.setDisable(false);
            label.textProperty().unbind();
            label.setText("Total " + countPDF);
        }
    });
    myProzessBar.progressProperty().unbind();
    myProzessBar.progressProperty().bind(myWorker.progressProperty());
    label.textProperty().bind(myWorker.messageProperty());
    new Thread(myWorker).start();
    startButton.setDisable(true);
}
@FXML
void initialize() {
}
private Task<Boolean> createWorker(File fileRoot) {    
    return new Task<Boolean>() {
        @Override
        protected Boolean call() throws Exception {
            File[] files = fileRoot.listFiles();
            for(File file : files) {
                if(file.isDirectory())
                // restart the method, but how can I do that
                else{
                    String fileName = file.getName();
                    if(fileName.endsWith(".pdf")){
                        updateMessage(++countPDF + "");
                        updateProgress(countPDF, 100);
                    }
                }
            }
            return true;
        }
    };
}
}

最新更新