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

我有一个包,其中包含 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] ->

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 中却失败了,它显示输入流有 0 个可用字节,我想知道为什么。我尝试了几种解决方案,但似乎都没有给我我想要的结果。我可能出什么问题或哪里出了问题?


MMMHUHU
浏览 42回答 1
1回答

墨色风雨

因此,经过更多研究后,上述代码只能在 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);            }        }    }
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java