当前位置: 首页 > 面试题库 >

Java:获取项目的绝对路径

农飞尘
2023-03-14
问题内容

我正在尝试在当前包外部的路径中运行exe文件。我运行它的code.java文件在

%Workspace_path%\Project\src\main\java\com\util\code.java

但是exe所在的目录

%Workspace_path%\Project\src\main\resources\program.exe

如果可能的话,似乎最好的解决方案是获取Project的绝对路径,然后在其中添加“ src \ main \ resources
\”。有什么好方法吗?或者有替代的解决方案?我正在使用Eclipse,但如果也可以在其他IDE中使用它,那就太好了。谢谢你的帮助。


问题答案:

解决此问题的实际方法是将EXE捆绑为类路径资源。看来您已经为此做好了准备。

使用类路径资源时,成熟的程序不应假定该资源位于文件系统中。资源可以打包在JAR文件中,甚至打包在WAR文件中。此时,您唯一可以信任的就是访问Java资源的标准方法,如下所示。

然后,解决问题的方法是使用实​​际的调用标准Class.getResourceAsStream(或ClassLoader.getResourceAsStream)访问资源内容,将内容保存到临时文件中,然后从该文件执行。这将确保您的程序无论其包装如何都能正常工作。

换一种说法:

  1. 调用getClass().getResourceAsStream("/program.exe")。从静态方法中,您无法调用getClass,因此请改为使用当前类的名称,如中所述MyClass.class.getResourceAsStream。这会传回InputStream
  2. 创建一个临时文件,最好使用File.createTempFile。这将返回一个File标识新创建文件的对象。
  3. 打开OutputStream此临时文件。
  4. 使用这两个流将数据从资源复制到临时文件中。IOUtils.copy如果您喜欢Apache Commons工具,则可以使用。完成此步骤后,不要忘记关闭两个流。
  5. 执行这样存储在临时文件中的程序。
  6. 清理。

换句话说(稍后添加了代码段):

private void executeProgramFromClasspath() throws IOException {
    // Open resource stream.
    InputStream input = getClass().getResourceAsStream("/program.exe");
    if (input == null) {
        throw new IllegalStateException("Missing classpath resource.");
    }

    // Transfer.
    OutputStream output = null;
    try {
        // Create temporary file. May throw IOException.
        File temporaryFile = File.createTempFile(getClass().getName(), "");

        output = new FileOutputStream(temporaryFile);
        output = new BufferedOutputStream(output);
        IOUtils.copy(input, output);
    } finally {
        // Close streams.
        IOUtils.closeQuietly(input);
        IOUtils.closeQuietly(output);
    }

    // Execute.
    try {
        String path = temporaryFile.getAbsolutePath();
        ProcessBuilder processBuilder = new ProcessBuilder(path);
        Process process = processBuilder.start();
        process.waitFor();
    } catch (InterruptedException e) {
        // Optional catch. Keeps the method signature uncluttered.
        throw new IOException(e);
    } finally {
        // Clean up
        if (!temporaryFile.delete()) {
            // Log this issue, or throw an error.
        }
    }
}


 类似资料:
  • 问题内容: 嗨,我需要使用FileInputStream读取文件,但是我没有获得正确的路径。我的文件位于C:\ Users \ tester \ Documents \ Java Project \ Samples \ ProjectOne \ src \ pdfReader中。但是,当我使用以下代码时,我得到的错误路径是“ / C:/ Users / tester / Documents / J

  • 本文向大家介绍获取Java中目录或文件的绝对路径,包括了获取Java中目录或文件的绝对路径的使用技巧和注意事项,需要的朋友参考一下 方法java.io.File.getAbsolutePath()用于获取字符串形式的文件或目录的绝对路径名。此方法不需要任何参数。 演示此的程序如下所示- 示例 上面程序的输出如下- 输出结果 现在让我们了解上面的程序。 使用方法java.io.File.getAbs

  • 本文向大家介绍获取Java中文件的绝对路径,包括了获取Java中文件的绝对路径的使用技巧和注意事项,需要的朋友参考一下 方法java.io.File.getAbsolutePath()用于获取字符串形式的文件的绝对路径。此方法不需要任何参数。 演示此的程序如下所示- 示例 上面程序的输出如下- 输出结果 现在让我们了解上面的程序。 使用方法java.io.File.getAbsolutePath(

  • 问题内容: 在这个话题上有很多困惑。已经提出了几个问题。事情似乎仍然不清楚。ClassLoader,绝对文件路径等 假设我有一个项目目录结构, 我在“ lib / txt”目录中有一个资源说“ txtfile.txt”。我想以系统独立的方式访问它。我需要项目的绝对路径。所以我可以将路径编码为abspath +“ / lib / Dictionary / txtfile.txt” 假设我这样做 我得

  • 本文向大家介绍JAVA获取文件绝对路径的方法,包括了JAVA获取文件绝对路径的方法的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了JAVA获取文件绝对路径的方法。分享给大家供大家参考。具体实现方法如下: 希望本文所述对大家的Java程序设计有所帮助。

  • 假设标准maven设置。 在Java中,我如何获得文件的绝对路径?