我有一个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应用程序中从类路径资源文件夹列出/读取文件的最佳方法:
ResourceLoader
ResourcePatternUtils
@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,则需要包括以下模式classpath*:elcordelaciutat/**。这将检索子文件夹(包括子文件夹)中的文件。获得所有资源后,请根据.txt文件扩展名对其进行过滤。这是您需要进行的更改:
elcordelaciutat
classpath*: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
当您想阅读资源时,应始终使用method getInputStream()。
getInputStream()