为了账号安全,请及时绑定邮箱和手机立即绑定

列出并读取 JAR 文件中 java 包中的所有文件不起作用

列出并读取 JAR 文件中 java 包中的所有文件不起作用

MMMHUHU 2024-01-05 19:58:42
我有一个包,其中包含 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);        }窗口结果[Path] -> file:/D:/path/to/application/lib/my-jarfile.jar!/this/is/my/package/containing/data/[Files] ->b2bb2cbalc2bolpolqregrevstatLinux 结果[Path] -> jar:file:/path/to/application/lib/my-jarfile.jar!/this/is/my/package/containing/data/[Files] -> [][available bytes] -> 0在 Windows 中它工作得很好,但在 Linux 中却失败了,它显示输入流有 0 个可用字节,我想知道为什么。我尝试了几种解决方案,但似乎都没有给我我想要的结果。我可能出什么问题或哪里出了问题?
查看完整描述

1 回答

?
墨色风雨

TA贡献1853条经验 获得超6个赞

因此,经过更多研究后,上述代码只能在 Windows 的 IDE 中运行,但对于 jar 文件则失败,因此我在 Linux 和 Windows 中得到的结果。


以下是我正在使用的工作解决方案。它可以以更简洁的方式重写,但由于时间原因,我保留了原样。它适用于类路径和 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);

            }

        }

    }


查看完整回答
反对 回复 2024-01-05
  • 1 回答
  • 0 关注
  • 92 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信