【问题标题】:Listing and reading all files in a java package within a JAR file not working列出和读取 JAR 文件中 java 包中的所有文件不起作用
【发布时间】:2019-11-26 06:24:57
【问题描述】:

我有一个包含 jar 文件中文件列表的包。这个想法是找到包中的所有文件并读取每个文件的内容。

private static final String DATA_DIRECTORY = "this/is/my/package/containing/data/";
try {
            URL url = this.getClass().getClassLoader().getResource(DATA_DIRECTORY);
            if (url.toExternalForm().startsWith("jar:")) {

                try (BufferedReader in = new BufferedReader(
                        new InputStreamReader(this.getClass().getClassLoader().getResourceAsStream(DATA_DIRECTORY)))) {
                    String inputLine;
                    while ((inputLine = in.readLine()) != null) {
                        System.out.println(inputLine);
                    }
                }
            } else {
                try (BufferedReader in = new BufferedReader(
                        new InputStreamReader(url.openStream()))) {
                    String inputLine;
                    while ((inputLine = in.readLine()) != null) {
                        System.out.println(inputLine);
                    }
                }
            }
        } catch (Exception e) {
            System.out.println(e);
        }

Windows 结果

[Path] -> file:/D:/path/to/application/lib/my-jarfile.jar!/this/is/my/package/containing/data/

[Files] ->
b2b
b2c
bal
c2b
olp
olq
reg
rev
stat

Linux 结果

[Path] -> jar:file:/path/to/application/lib/my-jarfile.jar!/this/is/my/package/containing/data/

[Files] -> []

[available bytes] -> 0

在 Windows 中它运行良好,但在 Linux 中它失败了,它显示 Inputstream 有 0 个字节可用,我想知道为什么。我尝试了几种解决方案,但似乎都没有给我想要的结果。我哪里出了问题?

【问题讨论】:

  • 您尝试访问的驱动器是否已安装?
  • @SachinBahukhandi 是的
  • 是否有权限访问该文件夹。
  • 尝试使用 sudo 运行命令 javac
  • 应用在su中运行,文件夹有rw权限。

标签: java package classpath classloader urlclassloader


【解决方案1】:

因此,经过更多研究,上述代码仅在 Windows 的 IDE 中有效,但对于 jar 文件,它失败了,因此我在 Linux 和 Windows 中都得到了结果。

以下是我正在使用的工作解决方案。它可以以非常简洁的方式重写,但由于时间关系,我一直保持原样。它适用于 Classpath 和 Jar 文件。

String directory = "/this/is/my/package/containing/data/";

注意,包名目录中需要以斜线开头。

String path = ClassLoader.class.getResource(directory).toExternalForm();
        if (path.startsWith("jar")) {
            try {
                URL url = new URL(path);
                System.out.println("JAR URL Name : " + url.toString());
                JarURLConnection connection = (JarURLConnection) url.openConnection();
                String jarFileName = connection.getJarFile().getName();
                System.out.println("JAR File Name : " + jarFileName);
                try (JarInputStream jarFile = new JarInputStream(new FileInputStream(jarFileName));) {
                    String regex = directory.substring(1);
                    do {
                        try {
                            JarEntry jarEntry = jarFile.getNextJarEntry();
                            if (jarEntry != null) {
                                String entryName = jarEntry.getName();
                                if (!regex.equals(entryName) && entryName.contains(regex)) {
                                    System.out.println("JAR Entry Name : " + entryName);
                                    try (InputStream in = YourClassName.class.getClassLoader().getResourceAsStream(entryName);
                                            Scanner scanner = new Scanner(in);) {
                                    //Do something in here                                       
                                    } catch (Exception ex) {
                                        System.out.println(ex);
                                    }
                                }
                            } else {
                                break;
                            }
                        } catch (IOException ex) {
                            System.out.println("JAR InputStream Error : " + jarFileName + " - > " + ex);
                            break;
                        }
                    } while (true);
                }
            } catch (Exception e) {
                System.out.println("JAR URL Connection Error : " + e);
            }
        } else {
            try {
                URL url = new URL(path);
                try (BufferedReader in = new BufferedReader(
                        new InputStreamReader(url.openStream()))) {
                    String fileName;
                    while ((fileName = in.readLine()) != null) {
                        String filePath = directory + fileName;
                        try (InputStream is = ClassLoader.class.getResourceAsStream(filePath);
                                Scanner scanner = new Scanner(is);) {
                           //Do something here
                        } catch (Exception ex) {
                            System.out.println(ex);
                        }
                    }
                }
            } catch (Exception e) {
                System.out.println("Classpath URL Connection Error : " + e);
            }
        }
    }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-04-04
    • 2012-01-02
    • 2013-01-17
    • 1970-01-01
    • 2017-08-01
    • 1970-01-01
    相关资源
    最近更新 更多