在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

回答:

我发现,结合使用ResourceLoaderResourcePatternUtils这是在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,则需要包括以下模式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()

以上是 在SpringBoot 2.0.1.RELEASE应用中读取文件 的全部内容, 来源链接: utcz.com/qa/405972.html

回到顶部