有没有办法获得执行或编译.java文件的文件路径?

时间:2016-10-02 20:24:55

标签: java netbeans path

在Python中,全局变量__file__是当前文件的完整路径。

System.getProperty("user.dir");似乎返回当前工作目录的路径。

我想获取当前.java,.class或包文件的路径。

然后使用它来获取图像的路径。

我在Netbeans中的项目文件结构如下所示:files http://pix.toile-libre.org/upload/original/1475433676.png

更新以使用我选择的最佳答案建议的代码:

    // read image data from picture in package
    try {
        InputStream instream = TesseractTest.class
            .getResourceAsStream("eurotext.tif");

        bufferedImage = ImageIO.read(instream);            
    }
    catch (IOException e) {
        System.out.println(e.getMessage());
    }

此代码用于tess4j的使用示例。

我的使用示例的完整代码是here

3 个答案:

答案 0 :(得分:1)

如果要加载存储在类文件旁边的图像文件,请使用Class::getResourceAsStream(String name)

在你的情况下,那将是:

try (InputStream instream = TesseractTest.class.getResourceAsStream("eurotext.tif")) {
    // read stream here
}

这假设您的构建系统将.tif文件复制到build文件夹,这通常由IDE完成,但需要在Ant和Gradle等构建工具中进行额外设置。

如果将程序打包到.jar文件,代码仍然有效,再次假设您的构建系统将.tif文件打包到.class文件旁边。

答案 1 :(得分:0)

  

有没有一种方法可以获取执行或编译的.java文件的文件路径?

为完整起见,对您的问题的字面上答案是“不容易也不总是”。

有一种通过StackFrameElement.getFileName()在调用堆栈中查找类的源文件名的方法。但是,文件名并不总是可用的 1 ,不一定是正确的 2

的确,在您执行代码的系统上很可能没有源树。因此,如果您需要一个保存在源代码树中的图像文件,那将会很不幸。

1-它取决于您使用的Java编译器和编译选项。可能还有其他事情。

2-例如,可以在编译后移动或删除源树。


安德烈亚斯(Andreas)描述了解决问题的正确方法。确保该图像文件位于应用程序的JAR文件中,然后使用getResourcegetResourceAsStream对其进行访问。如果您的应用程序使用的API需要在文件系统中使用文件名/路径名,则可能需要将JAR中的资源提取到临时文件或类似的文件中。

答案 2 :(得分:-1)

public class Main {
public static void main(String[] args) throws Exception {
    System.out.println(getPackageParent(Main.class, false));        

}

public static String getPackageParent(Class<?> cls, boolean include_last_dot)
        throws Exception {
    StringBuilder sb = new StringBuilder(cls.getPackage().getName());
    if (sb.lastIndexOf(".") > 0)
        if (include_last_dot)
            return sb.delete(sb.lastIndexOf(".") + 1, sb.length())
                    .toString();
        else
            return sb.delete(sb.lastIndexOf("."), sb.length()).toString();
    return sb.toString();
}

}