有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java获取jar内部包的路径

在我的java程序中,我有一个名为resources的包,在那里我保留了一个日志。ascii文件,我在其中保存一些详细信息。为此,我使用了这个方法

.class.getResource("/resources")当我在eclipse上测试它时,一切正常,但是当我构建jar时,它找不到路径。你知道如何克服这个问题吗? 谢谢你抽出时间

    private static String retrieveSelectedWorkspace() throws FileNotFoundException{

    String temp[];      
    String str=Gui.class.getResource("/resources").toString();

    temp=str.split("/",2);

    FileReader fr = null;
        fr = new FileReader(temp[1]+"/log.ascii");

    Scanner scanner = new Scanner(fr);

    while(scanner.hasNextLine())            
        return scanner.nextLine().toString();

    return null;
}
}

共 (4) 个答案

  1. # 1 楼答案

    我认为您的代码可以使用Class.getResourceAsStream()(需要将/resources/log.ascii打包到jar中,或者类路径上的其他地方)

    private static String retrieveSelectedWorkspace() throws FileNotFoundException {
        InputStream in = Gui.class.getResourceAsStream("/resources/log.ascii");
        Scanner scanner = new Scanner(in);
        while(scanner.hasNextLine())            
            return scanner.nextLine().toString();
        return null;
    }
    

    但至于你的实际问题,你肯定可以从一个jar中获取一个文件夹资源,只要这个文件夹被打包在jar中

    测试。爪哇:

    class Test {
        public static void main(String[] args) {
            System.out.println(Test.class.getResource("/text.txt"));
            System.out.println(Test.class.getResource("/folder"));
        }
    }
    

    命令行。创建一个文件和一个文件夹。然后尝试从.class文件运行代码和从.jar文件运行代码

    C:\Temp>echo text > text.txt
    
    C:\Temp>md folder
    
    C:\Temp>javac Test.java
    
    C:\Temp>java Test
    file:/C:/Temp/text.txt
    file:/C:/Temp/folder
    

    创建罐子:

    C:\Temp>jar cvf test.jar Test.class text.txt folder
    added manifest
    adding: Test.class(in = 530) (out= 347)(deflated 34%)
    adding: text.txt(in = 7) (out= 9)(deflated -28%)
    adding: folder/(in = 0) (out= 0)(stored 0%)
    

    从罐子里跑出来:

    C:\Temp>java -classpath test.jar Test
    jar:file:/C:/Temp/test.jar!/text.txt
    jar:file:/C:/Temp/test.jar!/folder
    
  2. # 2 楼答案

    在eclipse上运行日志时。ascii是文件系统中的一个文件,但当您将其打包到jar中时,日志会被删除。ascii是类似zip的文件中的一个条目。这就是为什么你没有完成它

    您可以创建一个临时文件,或在系统属性java.io.tmpdir指定的临时目录上创建该文件,以使其正常工作

  3. # 3 楼答案

    getResource返回一个URL。不要toString它,用它做一些丑陋的字符串连接。构建JAR后,URL不是文件系统URL。在Eclipse中开发并从那里运行时,您仍然可以使用这些文件

    当然,你不能在罐子里写资源

  4. # 4 楼答案

    试试看

    getClass().getClassLoader().getResource("/resources")))
    

    你也可以在一行中完成整个过程:

    new Scanner(new InputStreamReader(getClass().getClassLoader().getResourceAsStream("/resources/log.ascii"))).useDelimiter("\\A").next()