编程语言
首页 > 编程语言> > java – 在SpringBoot 2.0.1.RELEASE应用程序中读取文件

java – 在SpringBoot 2.0.1.RELEASE应用程序中读取文件

作者:互联网

我有一个SpringBoot 2.0.1.RELEASE mvc应用程序.
在资源文件夹中,我有一个名为/ elcordelaciutat的文件夹.

在控制器中我有这个方法来读取文件夹中的所有文件

ClassLoader classLoader = this.getClass().getClassLoader();
        Path configFilePath = Paths.get(classLoader.getResource("elcordelaciutat").toURI());    

        List<String> cintaFileNames = Files.walk(configFilePath)
         .filter(s -> s.toString().endsWith(".txt"))
         .map(p -> p.subpath(8, 9).toString().toUpperCase() + " / " + p.getFileName().toString())
         .sorted()
         .collect(toList());

        return cintaFileNames;

运行应用程序.来自Eclipse工作正常,但是当我在Windows Server中运行应用程序时出现此错误:

java.nio.file.FileSystemNotFoundException: null
    at com.sun.nio.zipfs.ZipFileSystemProvider.getFileSystem(ZipFileSystemProvider.java:171)
    at com.sun.nio.zipfs.ZipFileSystemProvider.getPath(ZipFileSystemProvider.java:157)
    at java.nio.file.Paths.get(Unknown Source)
    at 

我解压缩生成的jar文件,文件夹就在那里!

和文件夹的结构是

elcordelaciutat/folder1/*.txt
elcordelaciutat/folder2/*.txt
elcordelaciutat/folder3/*.txt

解决方法:

我发现ResourceLoader和ResourcePatternUtils的组合是从Spring Boot应用程序中的类路径资源文件夹列出/读取文件的最佳方式:

@RestController
public class ExampleController {

    private ResourceLoader resourceLoader;

    @Autowired
    public ExampleController(ResourceLoader resourceLoader) {
        this.resourceLoader = resourceLoader;
    }

    private List<String> getFiles() throws IOException {
        Resource[] resources = ResourcePatternUtils
                .getResourcePatternResolver(loader)
                .getResources("classpath*:elcordelaciutat/*.txt");

        return Arrays.stream(resources)
                   .map(p -> p.getFilename().toUpperCase())
                   .sorted()
                   .collect(toList());

    }
}

更新

如果要获取包含elcordelaciutat子文件夹中文件的所有文件,则需要包含以下模式类路径*:elcordelaciutat / **.这将检索子文件夹中的文件,包括子文件夹.获得所有资源后,根据.txt文件扩展名对其进行过滤.以下是您需要进行的更改:

private List<String> getFiles() throws IOException {
    Resource[] resources = ResourcePatternUtils
            .getResourcePatternResolver(loader)
            // notice **
            .getResources("classpath*:elcordelaciutat/**");

    return Arrays.stream(resources)
               .filter(p -> p.getFilename().endsWith(".txt"))
               .map(p -> {
                   try {
                       String path = p.getURI().toString();
                       String partialPath = path.substring(
                           path.indexOf("elcordelaciutat"));
                       return partialPath;
                   } catch (IOException e) {
                            e.printStackTrace();
                   }

                   return "";
                })
               .sorted()
               .collect(toList());
}

假设您有以下资源文件夹结构:

+ resources
  + elcordelaciutat
    - FileA.txt
    - FileB.txt
    + a-dir
      - c.txt
      + c-dir
        - d.txt
    + b-dir
      - b.txt

过滤后,列表将包含以下字符串:

> elcordelaciutat / FileA.txt
> elcordelaciutat / FileB.txt
> elcordelaciutat / a-dir / c-dir / d.txt
> elcordelaciutat / a-dir / c.txt
> elcordelaciutat / b-dir / b.txt

注意

当您想要读取资源时,应始终使用方法getInputStream().

标签:java,spring-mvc,spring,spring-boot-2,java-nio-file
来源: https://codeday.me/bug/20190713/1452966.html