当前位置: 首页 > 知识库问答 >
问题:

如何使用toURI从资源文件夹的子文件夹中读取文件

雷锋
2023-03-14

如何使用URI从资源文件夹的子文件夹中读取文件

    How to read files from the sub folder of resource folder.

资源文件夹中有一些json文件,如:

src 
    main
        resources 
            jsonData
                d1.json
                d2.json
                d3.json

现在我想在我的课堂上读这个

src 
    main
        java
            com
                myFile
                    classes 

这是我正在尝试的。

 File[] fileList = (new File(getClass().getResource("/jaonData").toURI())).listFiles();
    
            for (File file : listOfFiles) {
                if (file.isFile()) {
                   // my operation of Data.
                }
            }

我的东西工作正常,但我遇到的问题是我不想使用< code>toURI,因为它会失败。

共有1个答案

颛孙森
2023-03-14

你可能没有使用Spring Boot,所以如何在spring boot中从资源文件中读取文件夹:从Jar运行时出错对你没有太大帮助。

我将重复我自己对那个问题的评论:

JAR文件中的所有内容都不是文件,无法使用FileFileInputStream等访问。没有官方机制来访问JAR文件中的目录。

幸运的是,有一种非官方的方法,它利用了这样一个事实,即您可以将JAR文件作为一个单独的文件系统打开。

下面是一种既适用于基于文件的文件系统又适用于JAR文件中的资源的方法:

private void process() throws IOException {
    Path classBase = getClassBase();
    if (Files.isDirectory(classBase)) {
        process(classBase);
    } else {
        // classBase is the JAR file; open it as a file system
        try (FileSystem fs = FileSystems.newFileSystem(classBase, getClass().getClassLoader())) {
            Path root = fs.getPath("/");
            return loadFromBasePath(root);
        }
    }
} 

private Path getClassBase() {
    ProtectionDomain protectionDomain = getClass().getProtectionDomain();
    CodeSource codeSource = protectionDomain.getCodeSource();
    URL location = codeSource.getLocation();
    try {
        return Paths.get(location.toURI());
    } catch (URISyntaxException e) {
        throw new IllegalStateException(e);
    }
}

private void processRoot(Path root) throws IOException {
    // use root as if it's either the root of the JAR, or target/classes
    // for instance
    Path jsonData = root.resolve("jsonData");
    // Use Files.walk or Files.newDirectoryStream(jsonData)
}

如果您不喜欢使用ProtectDomain,则可以使用另一个小技巧,该技巧利用了每个类文件都可以作为资源读取的事实:

private Path getClassBase() {
    String resourcePath = '/' + getClass().getName().replace('.', '/') + ".class";
    URL url = getClass().getResource(resourcePath);
    String uriValue = url.toString();
    if (uriValue.endsWith('!' + resourcePath)) {
        // format: jar:<file>!<resourcePath>
        uriValue = uriValue.substring(4, uriValue.length() - resourcePath.length() - 1);
    } else {
        // format: <folder><resourcePath>
        uriValue = uriValue.substring(0, uriValue.length() - resourcePath.length());
    }
    return Paths.get(URI.create(uriValue));
}
 类似资料:
  • 如何从资源文件夹的子文件夹中读取文件。 我在资源文件夹中有一些json文件,例如: 现在我想在我的课堂上读到这个 这是我正在尝试的,但是失败了。 不起作用,那么我正在尝试: 这两样东西都不工作。

  • 我有一个名为的项目,它有以下结构: 所以这两个文件的路径是: 我想读测试文件。TestDataProvider中的json。JAVA 我曾经用过 我看到从URL res=getClass(). getClassLoader(). getResources("testfile.json")返回; 有人能帮我吗?

  • 问题内容: 我正在使用Spring Boot和。我正在尝试从文件夹读取一个文件。我尝试了几种不同的方法,但无法正常工作。这是我的代码。 这是文件的位置。 在这里,我可以看到文件夹中的文件。 但是,当我运行代码时,出现以下错误。 我在代码中做错了什么? 问题答案: 在花费大量时间尝试解决此问题之后,终于找到了可行的解决方案。该解决方案利用了Spring的ResourceUtils。也应该适用于jso

  • 我有一个资源文件夹/包在我的项目的根,我"不"想要加载某个文件。如果我想加载某个文件,我会使用class.getResourceAsStream,我会没事的!!我实际上想做的是在资源文件夹中加载一个“文件夹”,循环该文件夹中的文件,并获得每个文件的流,并在内容中读取...假设在运行时之前没有确定文件名...那我该怎么办?有没有一种方法来获得一个文件夹中的文件列表在您的jar文件?请注意,带有资源的

  • 我正在尝试从子项目中读取文件示例-dfx-sbi 文件位于src/main/resources文件夹内 那为什么文件没有加载呢?

  • 以下是我得到的错误: 提前感谢!