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. если он выводит, а вы его не читаете, он в конечном итоге зависнет, когда заполнится выходной буфер.
увидеть это, в частности, пример с чтением в другой теме.