Многопоточная обработка PDF - PullRequest
0 голосов
/ 02 октября 2018

Я пишу Java-программу, действие которой сводится к следующему:

  • В исходной папке выбрана подпапка с указанным именем.
  • Все PDF-файлы взяты и преобразованы в TXT-файлы в целевой папке.
  • Имя элемента ищется внутри текста.
  • Если имя найдено, то файл pdf от источника к цели копируется.
  • Все текстовые файлы из целевой папки удаляются, таким образом, все PDF-файлы, содержащие искомое слово, остаются.

«Все работает», проблема в том, что текстовые файлыне удаляются из цели, и я не могу понять, почему.Заранее спасибо, с наилучшими пожеланиями.

Launcher.java:

import java.lang.String;
import java.util.Scanner;
import java.io.File;

public class Launcher {

  // campi
  int status = 1;
  static String source = "C:\\Users\\MyUser\\Desktop\\source\\";
  static String target = "C:\\Users\\MyUser\\Desktop\\target\\";

  public static void main(String [] args) {
    // strings
    String src = source;
    String item = "";

    // init
    Scanner scan = new Scanner(System.in);
    System.out.print("\nFornitore: ");
    src += scan.nextLine().toUpperCase() + "\\";
    System.out.print("Item: ");
    item = scan.nextLine();

    // notifier
    Launcher launcher = new Launcher();

    // threads
    MakerThread maker = new MakerThread(launcher, src, target);
    SearcherThread searcher = new SearcherThread(launcher, src, target, item);
    CleanupThread cleaner = new CleanupThread(launcher, target);

    // run
    maker.start();
    searcher.start();
    cleaner.start();
  }
}

MakerThread.java:

import java.io.File;

public class MakerThread extends Thread {
  // campi
  String src = "";
  String target = "";
  Launcher launcher;

  // costruttore
  public MakerThread(Launcher launcher, String src, String target) {
    this.src = src;
    this.target = target;
    this.launcher = launcher;
  }

  // metodi
  @Override
  public void run() {
      try{
          synchronized (launcher) {
              File folder = new File(this.src);

              for (File f : folder.listFiles()) {
                // spin-lock
                while (launcher.status != 1){
                  launcher.wait();
                }

                if(f.isFile() && f.getName().endsWith("pdf")) {
                  System.out.println("PDF TROVATO: " + f.getName());

                  // input
                  String input = win_str(src + f.getName());

                  // output
                  String output = target;
                  output += f.getName().replaceAll(".pdf", ".txt");
                  output = win_str(output);

                  // command
                  String command = "cmd /C java -jar ./pdfbox-app-2.0.11.jar ExtractText ";
                  command += input + " " + output;
                  Process p1 = Runtime.getRuntime().exec(command);
                  p1.waitFor();
                }
              }

              // set status, awake other threads
              launcher.status = 2;
              launcher.notifyAll();
          }
      }catch (Exception e) {
          System.out.println("Exception: "+e.getMessage());
      }
  }

  private String win_str(String str) {
    return "\"" + str + "\"";
  }
}

SearcherThread.java:

import java.io.File;
import java.io.BufferedReader;
import java.io.FileReader;

public class SearcherThread extends Thread {
  // campi
  String src = "";
  String target = "";
  String item = "";
  Launcher launcher;

  // costruttore
  public SearcherThread(Launcher launcher, String src, String target, String item) {
    this.target = target;
    this.src = src;
    this.item = item;
    this.launcher = launcher;
  }

  // metodi
  @Override
  public void run() {
    try{
        synchronized (launcher) {
            File folder = new File(this.target);

            for(File f : folder.listFiles()) {
              // spin-lock
              while (launcher.status != 2){
                launcher.wait();
              }

              if(f.isFile() && f.getName().endsWith("txt")) {
                System.out.println("SEARCHING IN: " + f.getName());

                // init
                String line;
                BufferedReader br = new BufferedReader(new FileReader(new File(target+f.getName())));

                // txt search
                while((line = br.readLine()) != null) {
                  if(line.contains(item)) {
                    System.out.println("  [" + item + "]" + " trovato in " + f.getName() + "\n");

                    // input
                    String pdf = f.getName().replaceAll(".txt", ".pdf");
                    String input = win_str(src+pdf);

                    // output
                    String output = win_str(target);

                    // command
                    String command = "cmd /C copy " + input + " " + output;
                    Process p1 = Runtime.getRuntime().exec(command);
                    p1.waitFor();
                    break;
                  }
                }
              }
            }

            // set status, awake other threads
            launcher.status = 3;
            launcher.notifyAll();
        }
    }catch (Exception e) {
        System.out.println("Exception: "+e.getMessage());
    }
  }

  private String win_str(String str) {
    return "\"" + str + "\"";
  }
}

CleanupThread.java:

import java.io.File;

public class CleanupThread extends Thread {
  // campi
  String target = "";
  Launcher launcher;

  // costruttore
  public CleanupThread(Launcher launcher, String target) {
    this.target = target;
    this.launcher = launcher;
  }

  // metodi
  @Override
  public void run() {
      try{
          synchronized (launcher) {
              File folder = new File(this.target);

              for (File f : folder.listFiles()) {
                // spin-lock
                while (launcher.status != 3){
                  launcher.wait();
                }

                if(f.isFile() && f.getName().endsWith("txt")) {
                  System.out.println("CLEANING UP: " + f.getName());

                  // input
                  String input = win_str(target + f.getName());

                  // command
                  String command = "cmd /C del " + input;
                  Process p1 = Runtime.getRuntime().exec(command);
                  p1.waitFor();
                }
              }

              // set status, awake other threads
              launcher.status = 1;
              launcher.notifyAll();
          }
      }catch (Exception e) {
          System.out.println("Exception: "+e.getMessage());
      }
  }

  private String win_str(String str) {
    return "\"" + str + "\"";
  }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...