Problemas encontrados en la lectura de archivos por lotes (carpetas) a través de classLoader

Prefacio

适用springboot 简单搭建了一个小环境,通过classLoader获取classpath下的文件夹中的文件,批量获取文件,也许你不知道有多少文件和文件的名称,基于这个情况下总结了一些经验教训

alrededores

  1. Cree una carpeta bajo el recursoInserte la descripción de la imagen aquí
    Aquí hay dos archivos, ayb, si conocemos el nombre del archivo, será fácil obtenerlo a través de classLoader.getResourceAsStream (), asumiendo que no sabemos el nombre del archivo y la cantidad

  2. Escribir clase de prueba

    Demostración del código de error \ color {rojo} {demostración del código de error} Error error - código de generación mostrado FAN

         // 获取class 根目录
        URL resource = FileJar.class.getClassLoader().getResource("my/file");
        System.out.println(resource.getPath());
        //        获取my/file 下的所有文件
        File[] files = new File(resource.getPath()).listFiles();
        if (files != null) {
          
          
        Arrays.stream(files).forEach(e -> System.out.println("file path = " + e.getAbsolutePath()));
    
        }
    

    Salida

       /F:/workSpaces/idea/springboot-test/file-jar/target/classes/my/file
    file path = F:\workSpaces\idea\springboot-test\file-jar\target\classes\my\file\a.txt
    file path = F:\workSpaces\idea\springboot-test\file-jar\target\classes\my\file\b.txt
    
    

** No parece ningún problema, pero después de empaquetarlo como un jar,
archivo de salida : / F: /workSpaces/idea/springboot-test/file-jar/target/file-jar-0.0.1-SNAPSHOT.jar! / BOOT-INF / classes! / my / file
es una ruta jar de archivo comprimido, el archivo no se puede leer **

La direccion correcta

   Enumeration<URL> resources = FileJar.class.getClassLoader().getResources("my/file");
        while (resources.hasMoreElements()) {
    
    
            URL url = resources.nextElement();
            // 通过判断协议是不是jar文件
            if (url.getProtocol().equals("jar")) {
    
    
                JarURLConnection urlConnection = (JarURLConnection) url.openConnection();
                JarFile jarFile = urlConnection.getJarFile();
                Enumeration<JarEntry> entries = jarFile.entries(); // 返回jar中所有的文件目录
                while (entries.hasMoreElements()) {
    
    
                    JarEntry jarEntry = entries.nextElement();
                    if (!jarEntry.isDirectory() && jarEntry.getName().startsWith("my/file")) {
    
      // 是我们需要的文件类型
                        String name = jarEntry.getName();
                        System.out.println("name  = " + name);
                        InputStream resourceAsStream = FileJar.class.getClassLoader().getResourceAsStream(name);
                        Properties p = new Properties();
                        p.load(resourceAsStream);
                        System.out.println(p);
                    }
                }
            } else if (url.getProtocol().equals("file")) {
    
    
                // 获取class 根目录
                URL resource = FileJar.class.getClassLoader().getResource("my/file");
                System.out.println(resource.getPath());
                // 获取my/file 下的所有文件
                File[] files = new File(resource.getPath()).listFiles();
                if (files != null) {
    
    
                    Arrays.stream(files).forEach(e -> System.out.println("file path = " + e.getAbsolutePath()));
                }
            }
        }
通过jarFile 来获取jar包中的文件, 如果有其他jar包和你的文件夹命名相同可以添加 url条件进行判断

Puntos de conocimiento

ClassLoader.getResource(String name);

ClassLoader.getResource("");  // 获取的是项目根目录,也就是到classes/这一层

ClassLoader.getResources(String name);

ClassLoader.getResources("my/file/a.properties"); // 加载多个jar文件中的 my/file/a.properties 文件, springboot的spring.factories 就是这么加载的

ClassLoader.getResourceAsStream(String name);

Supongo que te gusta

Origin blog.csdn.net/xiaodujava/article/details/112765353
Recomendado
Clasificación