Java:获取项目的绝对路径

时间:2013-03-25 01:58:10

标签: java file-io

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

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

然而,exe的目录是

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

如果可能,似乎这里最好的解决方案是获取项目的绝对路径然后将“src \ main \ resources \”附加到它。有没有一个好方法可以做到这一点还是有替代解决方案? 我正在使用Eclipse,但如果它也可以在其他IDE中使用它会很棒。谢谢你的帮助。

2 个答案:

答案 0 :(得分:4)

解决此问题的事实上的方法是将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. 使用这两个流将资源中的数据复制到临时文件中。如果您使用的是Apache Commons工具,则可以使用IOUtils.copy。完成此步骤后,请不要忘记关闭两个流。
  5. 执行存储在临时文件中的程序。
  6. 清理。
  7. 换句话说(稍后添加的代码段):

    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.
            }
        }
    }
    

答案 1 :(得分:0)

嗯,在您的上下文中,项目根目录恰好是当前路径

  

即可。

,这是java.exe开始执行的地方,所以一个简单的方法是:

String exePath="src\\main\\resources\\program.exe";
File exeFile=new File(".",exePath);
System.out.println(exeFile.getAbusolutePath());
...

我在Eclipse上测试了这段代码,没关系。我认为应该在不同的ide上工作。 祝你好运!