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

使用InputStreamReader读取JAR中的目录

景永望
2023-03-14
问题内容

因此,我相信这个问题已经问了一百万遍了,我已经阅读了几个小时,并尝试了一些人给出的几种选择,但是没有一个对我有用。

我想列出应用程序JAR内目录中的所有文件,因此在IDE中可以运行:

File f = new File(this.getClass().getResource("/resources/").getPath());

for(String s : f.list){
   System.out.println(s);
}

这给了我目录中的所有文件。

现在,我也尝试过:

InputStream in = this.getClass().getClassLoader().getResourceAsStream("resources/");
    InputStreamReader inReader = new InputStreamReader(in);
    Scanner scan = new Scanner(inReader);

    while (scan.hasNext()) {
        String s = scan.next();
        System.out.println("read: " + s);
    }

    System.out.println("END OF LINE");

然后从IDE中打印目录中的所有文件。外部IDE打印:“行尾”。

现在,我也可以在Jar中找到一个条目:

        String s = new File(this.getClass().getResource("").getPath()).getParent().replaceAll("(!|file:\\\\)", "");
        JarFile jar = new JarFile(s);

            JarEntry entry = jar.getJarEntry("resources");

        if (entry != null){
            System.out.println("EXISTS");
            System.out.println(entry.getSize());
        }

那是我必须对那个String进行的可怕编码。

无论如何…我无法在Jar的“ resources”目录中获取资源列表。该怎么办?


问题答案:

如果不先枚举Jar文件的内容,就无法简单地获取内部资源的过滤列表。

幸运的是,这实际上并不难(对我来说幸运的是,您已经完成了大部分工作)。

基本上,一旦有了对的引用JarFile,您只需要询问它entries并在该列表上进行迭代即可。

通过检查JarEntry所需匹配项的名称(即resources),您可以过滤所需的元素…

例如…

import java.io.File;
import java.io.IOException;
import java.util.Enumeration;
import java.util.jar.JarEntry;
import java.util.jar.JarFile;

public class ReadMyResources {

    public static void main(String[] args) {
        new ReadMyResources();
    }

    public ReadMyResources() {
        JarFile jf = null;
        try {            
            String s = new File(this.getClass().getResource("").getPath()).getParent().replaceAll("(!|file:\\\\)", "");
            jf = new JarFile(s);

            Enumeration<JarEntry> entries = jf.entries();
            while (entries.hasMoreElements()) {
                JarEntry je = entries.nextElement();
                if (je.getName().startsWith("resources")) {
                    System.out.println(je.getName());
                }
            }
        } catch (IOException ex) {
            ex.printStackTrace();
        } finally {
            try {
                jf.close();
            } catch (Exception e) {
            }
        }
    }

}

警告

这种类型的问题实际上有点问。与其尝试在运行时读取Jar的内容,不如生成某种包含可用资源列表的文本文件,这会更好。

这可以由您的构建过程在创建Jar文件之前动态产生。然后(getClass().getResource()例如,通过)读取该文件,然后在文本文件中查找每个资源列表,这将是一个简单得多的解决方案…恕我直言



 类似资料:
  • 我刚刚遇到了jar中的主类无法读取文件夹内容的问题。该类包含 这里sysout返回。 但当我尝试这样的东西时 为什么会这样,这两种方法对JAR内部内容的读取机制有什么区别。简单罐子里的东西

  • 问题内容: 我正在尝试访问我的jar文件中的目录。我想浏览目录本身内的每个文件。例如,我尝试使用以下方法: 如果我测试此小程序,它将很好地工作。但是,一旦将内容物放入广口瓶中,并不是有几个原因。如果使用此代码,则URL始终指向jar外部,因此必须将目录放在此处。但是如果我使用的话,它不能在jar里面起作用,因为我得到了错误。我确定该目录存在于jar中。我应该如何获得罐子里的东西? 问题答案: Ja

  • 问题内容: 我的程序需要读取一些文本配置文件。我当前的代码是: 当我在eclipse中本地运行它时,此方法有效,尽管我确实必须进行破解以处理路径名中的空间。配置文件与上述方法位于同一软件包中。但是,当我将应用程序导出为jar时,出现了问题。该jar位于共享的映射网络驱动器Z:上。当我从命令行运行应用程序时,出现此错误: java.io.FileNotFoundException:文件:\ Z:\

  • 问题内容: 我已经编写了一个程序来加密Netbeans中的图像。从Netbeans运行时,该程序运行良好,但是当我将其构建为.jar文件时,即使我将图像文件与.jar文件放在同一文件夹中,它也无法读取图像。 //加密 //加载/写入图片 问题答案: 目前尚不清楚以下哪个触发您的错误。这个 将从当前目录读取,该目录不一定与您的jar文件所在的目录相同。 这个 将从类所在的jar文件中的目录中读取。请

  • 我试图编写一个简单的复数计算器,可以计算以下表达式: 输入1:(10 30i)(90 20i) 预期输出:(100 50i) 输入2:(10 30i)-(90 20i) 预期输出:(-80 10i) 编辑:我注意到第一次前瞻读取是10而不是40(ascii值 '(' ) . 我如何解决这个问题? 我的代码: 但它总是输出“对不起,我帮不了你。”

  • 无效的流头:0000002b at java.io.objectinPutStream.ReadStreamHeader(ObjectinPutStream.java:781)at java.io.objectinPutStream.(ObjectinPutStream.java:278)at servicerEquest.run(servicerEquest.java:24)at java.ut