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

标签 java file runtime

我使用 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/

相关文章:

python - 为什么在 Python 中从多个进程写入文件时我的文件没有损坏?

java - 如何使用扫描仪类 : Exception in thread "main". 解决此错误 ..?

graphics - 如何优化代码以使设置更快

java - 通过 Tomcat 上的 BIRT 报告查看器生成 BIRT 报告

java - jPanel 的背景图像不工作

java - KeyPressedEvent 到 JTextArea 的 SetText

java - 包含方括号的 Spring 请求映射

javascript - 缓冲客户端文件下载

javascript - 从对象 dataURL 创建文件

ios - 马特加洛韦书 EOC : delegate ignore protocol method