gpt4 book ai didi

java - 如何在Java中使用运行时对象打开多个文件?

转载 作者:行者123 更新时间:2023-12-01 15:04:26 25 4
gpt4 key购买 nike

我使用 Runtime.getRuntime().exec(String cmd) 函数打开 Office 文件(docx、xlsx)。同时,我将这些文件的元数据存储在数据库中。为了保持完整性,我使用元数据中的标志锁定文件,以便其他用户不能同时修改该文件。这意味着在用户关闭文件(例如关闭外部进程)后必须自动重置该标志。

这是打开文件的代码片段:

File file = new File("c:/test.docx");
Process process = null;
if(file.getName().endsWith("docx")) {
process = Runtime.getRuntime().exec("c:/msoffice/WINWORD.EXE "+file.getAbsolutePath());
} else if(file.getName().endsWith("xlsx")) {
process = Runtime.getRuntime().exec("c:/msoffice/EXCEL.EXE "+file.getAbsolutePath());
}
if(process!=null) {
new ProcessExitListener(file, process);
}

这是我的监听器,它等待用户关闭文件(并最终通过在元数据中设置标志来解锁文件):

private class ProcessExitListener extends Thread {

private File file;
private Process process;

public ProcessExitListener(File file, Process process) throws IOException {
this.setName("File-Thread ["+process.toString()+"]");
this.file = file;
this.process = process;
this.start();
}

@Override
public void run() {
try {
process.waitFor();
database.unlock(file);
} catch (InterruptedException ex) {
// print exception
}
}
}

这适用于不同的文件类型,例如如果我同时打开 1 个 docx 和 1 个 xlsx 文件。但是当打开2个docx文件时,其中一个进程在初始化后立即退出。

有什么想法吗?

提前感谢您的帮助!

最佳答案

But when opening 2 docx files, one of the process exists right after it has been initialized.

可能是因为 winword.exe 进程发现它已经有一个实例在运行,因此它不会在内存中保留两个实例,而是只要求第一个实例打开第二个文档。不知道从 GUI 角度来看它是什么样子,但是看看任务管理器,尝试从 Windows 资源管理器中打开两个 Word 文档。第二个文件不会导致第二个 winword.exe 进程启动。

我可以在 Ubuntu Linux 上重现完全相同的行为。当我运行时:

$ geany foo.txt

geany编辑器尚未运行,控制台会挂起,直到我关闭编辑器。但如果我打开另一个终端并调用:

$ geany bar.txt

这会立即返回,并且 bar.txt 只是作为现有进程中的另一个选项卡打开。

关于java - 如何在Java中使用运行时对象打开多个文件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13166314/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com