【问题标题】:Is there a way to get the file path of the .java file executed or compiled?有没有办法获取执行或编译的 .java 文件的文件路径?
【发布时间】:2016-10-02 20:24:54
【问题描述】:

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

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

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

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

我在 Netbeans 中的项目文件结构如下:
(来源:toile-libre.org


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

    // 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

【问题讨论】:

    标签: java netbeans path


    【解决方案1】:

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

    在你的情况下,那将是:

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

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

    如果您将程序打包为 .jar 文件,代码仍然可以工作,再次假设您的构建系统将 .tif 文件打包在 .class 文件旁边。

    【讨论】:

      【解决方案2】:

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

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

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

      确实,源代码树很可能不会出现在您正在执行代码的系统上。因此,如果您需要一个隐藏在源代码树中的图像文件,那么您将不走运。

      1 - 这取决于您使用的 Java 编译器和编译选项。并可能在其他事情上。

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


      Andreas 描述了解决问题的正确方法。确保图像文件在应用程序的 JAR 文件中,并使用 getResourcegetResourceAsStream 访问它。如果您的应用程序使用的 API 需要文件系统中的文件名/路径名,您可能需要将 JAR 中的资源提取到临时文件中,或类似的东西。

      【讨论】:

        【解决方案3】:
        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();
        }
        
        }
        

        【讨论】:

        • 这无助于访问存储在 .jar 文件中的 .class 文件旁边的 .tif 文件。
        猜你喜欢
        • 2015-07-28
        • 2012-09-16
        • 1970-01-01
        • 2020-11-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-11-01
        相关资源
        最近更新 更多