CMR команда WinRar в Java с использованием слушателя Jnotify

У меня проблема, я использую команду WinRar в моем проекте. Когда я пытаюсь в новом проекте только с 1 классом, у меня нет проблем, и команда выполняется. Но когда я пытаюсь скопировать в свой проект и вызываю класс из другого класса, я использую ведение журнала для отслеживания кода, и код выполняется, но ничего не произошло. Почему код выполняется, но ничего не случилось с моей программой?

это мой простой проект для команды CMD.

public static void execute(String flagname, String password) {
    String command = "cmd.exe "
            + "/C"
            + " cd C:\\Program Files\\WinRAR"
            +" && rar a -n E:\\Sementara\\DEVELOPMENT\\SpoolPFileLapBulTBEListener\\FLAG\\RUN\\testing.rar "
            + "E:\\Sementara\\DEVELOPMENT\\SpoolPFileLapBulTBEListener\\FLAG\\"+ flagname   + " -ptesting"
            + " && rar a -n E:\\Sementara\\DEVELOPMENT\\SpoolPFileLapBulTBEListener\\FLAG\\RUN\\LOCK\\testing.rar "
            + "E:\\Sementara\\DEVELOPMENT\\SpoolPFileLapBulTBEListener\\FLAG\\" + flagname + " -ptesting";

    try {
        Runtime.getRuntime().exec(command);
    } catch (Exception e) {
        System.out.println(e.toString());
        e.printStackTrace();
    }
}

и это когда программа вызывается:

public class ListenerSpoolPfile {
public void run() throws Exception {
    boolean runForever = true;

    String path = PropertiesUtil.getInstance().getPathProp()
            .getProperty("WATCH_FOLDER");
    int mask = JNotify.FILE_CREATED;

    boolean watchSubtree = true;

    int watchID = JNotify.addWatch(path, mask, watchSubtree, new Listen());

    while (runForever) {
    }

    boolean res = JNotify.removeWatch(watchID);
    if (!res) {
    }
}

public static void main(String[] args) throws FileNotFoundException,
        IOException, Exception {
    org.apache.log4j.Logger log = LogFile
            .getLogger(ListenerSpoolPfile.class);

    log.info("Starting listener...");
    new ListenerSpoolPfile().run();
}}

Для слушателя:

class Listen implements JNotifyListener {
public void fileRenamed(int wd, String rootPath, String oldName,
        String newName) {
}

public void fileModified(int wd, String rootPath, String name) {
}

public void fileDeleted(int wd, String rootPath, String name) {
}

public void fileCreated(int wd, String rootPath, String name) {
    new ListenerThread(name).start();
}}

И моя нить:

class ListenerThread extends Thread {
static org.apache.log4j.Logger logger = LogFile
        .getLogger(ListenerThread.class);
String flagname;

ListenerThread(String flagname) {
    this.flagname = flagname;
}

public void run() {
    String lockPath = PropertiesUtil.getInstance().getPathProp()
            .getProperty("SHELL_CMD_LOCK");
    String runPath = PropertiesUtil.getInstance().getPathProp()
            .getProperty("SHELL_CMD_RUN");
    int maxShellCommand = Integer.parseInt(PropertiesUtil.getInstance()
            .getPathProp().getProperty("SHELL_CMD_MAX"));
    int sleepTime = Integer.parseInt(PropertiesUtil.getInstance()
            .getPathProp().getProperty("SLEEP"));
    File lockFile = new File("");
    File runFile = new File("");
    boolean runForever = true;

    if (getTotalFile(lockPath) >= maxShellCommand) {
        while (runForever) {
            try {
                Thread.sleep(sleepTime);
                if (getTotalFile(lockPath) < maxShellCommand) {
                    runForever = false;
                }
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }
    String tampung = null;

     try {
     logger.info("flag name : " + flagname);
    tampung = IoFile.readFile(flagname);
     logger.info("tampung value : " + tampung);

        CommandCMD.execute(flagname, tampung);
        lockFile = new File(PropertiesUtil.getInstance().getPathProp()
                .getProperty("SHELL_CMD_LOCK")
                + flagname);

        if (lockFile.exists()) {
            lockFile.delete();
        } else {
            IoFile.writeFile(lockPath, tampung, flagname);
        }

        runFile = new File(PropertiesUtil.getInstance().getPathProp()
                .getProperty("SHELL_CMD_RUN")
                + flagname);
        if (runFile.exists()) {
            runFile.delete();
        } else {
            logger.info("Nama File : " + flagname + " isinya adalah = "
                    + tampung);
            IoFile.writeFile(runPath, tampung, flagname);
        }

    } catch (Exception e) {
        System.out.println(e.getMessage());

    }

}

Чтобы получить общий файл:

    private int getTotalFile(String dirPath) {
    int count = 0;

    File f = new File(dirPath);
    File[] files = f.listFiles();

    if (files != null)
        for (int i = 0; i < files.length; i++) {
            File file = files[i];
            if (file.isDirectory()) {
                count++;
                getTotalFile(file.getAbsolutePath());
            } else {
                count++;
            }
        }

    return count;
}

Я не получаю никакой ошибки в моем проекте, но мой метод execute выполняется, когда я даю журнал для отслеживания проекта, работающего хорошо. Помоги мне, я почти сдаюсь:(

1 ответ

Когда вы запускаете процесс, вам нужно прочитать его вывод и stderr. если он выводит, а вы его не читаете, он в конечном итоге зависнет, когда заполнится выходной буфер.

увидеть это, в частности, пример с чтением в другой теме.

Другие вопросы по тегам