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

Java如何在jar环境而不是IDE中读取文件夹和列出该文件夹中的文件

梁丘伟
2023-03-14

我的问题是,我在src下创建了一个文件夹(名称为IconResources),在IconResources中有许多图片。目录如下:

  • 项目名称
    • src
      • 包裹1
      • 包裹2
      • 图标资源(这是目标文件夹)

      我想列出所有图片文件的名称,并对这些图片进行处理。我找到了那个文件。list()只在IDE中工作,若我将项目导出到jar以使其成为独立的,它将无法工作。所以我搜索并发现我应该使用inputstream和outputstream。现在我发现I/o流可以很好地用于单个文件。但我想使用inputstream和outputstream读取文件夹(IconResource),然后列出该文件夹中的文件。

      因此,我的问题是如何使用i/o put stream加载文件夹并迭代该文件夹以列出该文件夹中的文件名。这些东西不仅应该在IDE下工作,还应该在导出的jar下工作。我的代码如下:

      private void initalizeIconFiles(File projectDirectory){
      
          URL a = editor.getClass().getResource("/IconResources/");// Get Folder URL
          List<String> iconFileNames=new ArrayList<String>();//Create a list to store file names from IconResource Folder
          File iconFolder = new File(a.getFile());
          Path path=Paths.get(iconFolder.getPath());
          DirectoryStream<Path> stream = Files.newDirectoryStream(path) ;
          for (Path entry : stream) {
              if (!Files.isDirectory(entry)) {
                  System.out.println(entry.getFileName().toString());
                  iconFileNames.add(entry.getFileName().toString());// add file name in to name list
              }
          }
      }
      

      上述代码只能在IDE下运行,但在导出的jar中会崩溃。

共有3个答案

岳正阳
2023-03-14

我终于解决了。我采用了Boris the Spider的答案,它在IDE中运行良好,但在导出的Jar中出现故障。然后我改变

最终输入流为=加载器。getResourceAsStream(“文本”);

最终输入流为=加载器。getResourceAsStream(“/文本”);

然后它可以在IDE和JAR中工作。

鲜于煜祺
2023-03-14

您可以使用JARInputStream读取JAR文件的内容

南门宇
2023-03-14

这实际上是一个非常困难的问题,因为类加载器必须考虑这样一个事实,即在运行时,类路径上可能有另一个名为IconResources的文件夹。

因此,没有“官方”方法从类路径列出整个文件夹。我在下面给出的解决方案是一种黑客攻击,目前可用于URLClassLoader的实现。这可能会发生变化。

如果你想要健壮的方法,你需要使用类路径扫描仪。库形式有很多,我个人最喜欢的是反射,但是Spring有一个内置的,还有很多其他选项。

在黑客上。

通常,如果您在URLClassLoadergetResourceAsStream,那么它将返回该文件夹中的资源流,每行一个。URLClassLoader是JRE使用的默认值,因此如果您不更改该行为,这种方法应该可以开箱即用。

假设我有一个具有以下类路径结构的项目:

/
    text/
        one.txt
        two.txt

然后运行以下代码:

final ClassLoader loader = Thread.currentThread().getContextClassLoader();
try(
        final InputStream is = loader.getResourceAsStream("text");
        final InputStreamReader isr = new InputStreamReader(is, StandardCharsets.UTF_8);
        final BufferedReader br = new BufferedReader(isr)) {
    br.lines().forEach(System.out::println);
}

将打印:

one.txt
two.txt

所以,为了得到一个列表

public static List<URL> getResources(final String path) throws IOException {
    final ClassLoader loader = Thread.currentThread().getContextClassLoader();
    try (
            final InputStream is = loader.getResourceAsStream(path);
            final InputStreamReader isr = new InputStreamReader(is, StandardCharsets.UTF_8);
            final BufferedReader br = new BufferedReader(isr)) {
        return br.lines()
                .map(l -> path + "/" + l)
                .map(r -> loader.getResource(r))
                .collect(toList());
    }
}

现在请记住,这些URL位置是不透明的。它们不能被视为文件,因为它们可能位于中。jar,或者他们甚至可能在互联网上的某个位置。因此,要读取资源的内容,请使用URL上的适当方法:

final URL resource = ...
try(final InputStream is = resource.openStream()) {
    //do stuff
}

 类似资料:
  • 问题内容: 我开发了一个应用程序,可以从用户选择的文件夹中读取文件。它显示每个文件中有多少行代码。我只希望Java文件显示在文件选择器(扩展名为.java的文件)中。下面是我的代码: 我也进行了编辑,但是仍然无法正常工作,请告知请告知如何仅读取扩展名为.java的文件,换句话说,请仅从文件夹中读取java文件,请告知 问题答案: 您需要一个FilenameFilter。这应该为您工作:

  • 我一直在尝试制作可以读取与它相同目录中的csv文件的jar应用程序。然而,事实证明这很困难,因为我目前访问该文件的方法是: 它适用于在IDE中运行的程序和测试,但在从编译的jar文件运行程序时不起作用。我不知道如何让它对这两者都起作用。我真的不能理解这个路径的东西,似乎有一百万种方法可以做到这一点,其中只有一种只适用于一个特定的场景。

  • 如何从资源文件夹的子文件夹中读取文件。 我在资源文件夹中有一些json文件,例如: 现在我想在我的课堂上读到这个 这是我正在尝试的,但是失败了。 不起作用,那么我正在尝试: 这两样东西都不工作。

  • 它可以工作,很酷,但问题是它不能计算正常的文件,如。txt或。png...我知道它写在这个方法中,但idk如何修复它而不破坏其他一切 我可以重做这个方法吗?(此代码不是我的https://stackoverflow.com/a/33438475/13547682)

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

  • 问题内容: 如何通过Java读取文件夹中的所有文件? 问题答案: Java 8提供了Files.walk API。