spring boot-列出类路径中的所有文件

cbeh67ev  于 2021-07-24  发布在  Java
关注(0)|答案(3)|浏览(542)

在spring引导应用程序中,我有application.yaml文件,其属性如下

files:
  paths: /csvfiles/

在里面的时候 src/main/resource ,我们有一个名为csvfiles的文件夹,其中包含我要读取的csv文件列表。
我试图寻找相同的,但没有得到任何适当的方式来实现相同的。 getClass().getResourceAsStream("/files/paths") cal仅用于获取特定文件,而不用于获取文件列表。
列出所有文件后,我希望按顺序读取它们

byqmnocz

byqmnocz1#

在spring中,一种解决方案是,可以从一个属于classpath的文件夹中注入resources数组

@Value("classpath:path/*")
private Resource[] files;
mwecs4sa

mwecs4sa2#

假设您的代码内置在一个可执行jar中,那么 src/main/resources 在jar里。您可以列出jar文件的内容,然后根据每个条目的路径,选择具有 csvfiles 在小路上。
要找出类来自哪个jar,请参见下面的内容。要列出jar文件的内容,请参见以下内容。
显然,这在本地运行时不起作用,因此需要一种替代方法。您可以用这个找到类文件的位置,然后导航到 csvfiles 相对于它的目录。

2nc8po8w

2nc8po8w3#

是的 YourClass.class.getResourceAsStream ,不是 getClass() ,如果你把东西分为子类,它就有可能被破坏。
getresource机制根本不知道文件夹是什么,也不能给你一个列表。句号。类加载器是一种抽象,它们可以实现为读取jar文件、磁盘上的目录,也可以从网络加载、从数据库检索或动态生成,最关键的是,没有请列出文件夹内容选项,所以不管你在那里发现什么(还有一些库之类的),都是在这种情况下无法工作的黑客。
常见的解决方案是创建一个列出资源的文本文件。现在您不再依赖于不可用的“list files”操作:相反,您请求任何类路径条目上该文本文件的所有版本,然后只读取列出的每个文件。当应用于类时,这称为spi系统(服务提供者接口)。内置 java.* 它本身就是读取它们的能力,尽管它们是为类而不是文件设计的,所以我不确定spi系统是否直接应用于这里。不过,这个原则很管用。
如果您想让它自动化,作为构建的一部分,您必须自动生成该文件。不知道你会怎么做,与Spring Boot,你可能要维护它的手。
举个例子:

class CsvResource {

  public CsvResource(String name) {
    try (var in = CsvResource.class.getResourceAsStream("/csvfiles/" + name)) {
      read(in); // you write this one.
    }
  }

  public static List<String> getAvailableNames() {
    try (var in = CsvResource.class.getResourceAsStream("/csvfiles/listing.txt")) {
      Arrays.stream(
        new String(in.readAllBytes, StandardCharsets.UTF_8).split("\s*\\n\s*"))
        .filter(x -> !x.isEmpty())
        .filter(x -> !x.startsWith("#"))
        .collect(Collectors.toList());
    }
  }
}

捕获ioexception是公平的,特别是对于丢失的csvfiles,并将其重写为运行时异常—运行时不存在的文件是开发人员或devops错误,这些应该是错误或至少是运行时异常。

相关问题