如何从相对路径+类加载器获取绝对目录路径

时间:2017-02-01 10:07:07

标签: java classloader relative-path resourcebundle absolute-path

我有一个类,其构造函数接收相对资源路径(语言属性文件)和相应的类加载器(路径相对于classLoader的包):

public Language(String relDir, ClassLoader classLoader) {
    ...
}

在该类中,我有一个加载所有找到的资源文件的方法(属性文件,如MyFile_en_GB.properties),并且它不知道预先有多少语言资源。它使用 languagesDir 作为查找资源的绝对路径。

private void loadLanguages() {
    DirectoryStream.Filter<Path> filter = (path) -> {
      return Files.isRegularFile(path) & path.getFileName()toString().startsWith("MyFile");
    };
    try (DirectoryStream<Path> stream = Files.newDirectoryStream(languagesDir, filter)) {
        for (Path entry : stream) {
          String fileName = entry.getFilename().toString();
          ...
          loadPropertiesFile(filename)
        }
    } catch (..) {}
}

在那里,languagesDir使用绝对路径。但是,当我尝试时:

String dir = classLoader.getResource(relDir).toString();

它会引发异常。我想这是因为它需要一个文件,而不是一个目录

如何获得资源的绝对路径?我应该尝试另一种方法,只使用相对路径(如何做到这一点)?

编辑:关于例外: classLoader.getResource(relDir)提供空网址

2 个答案:

答案 0 :(得分:0)

尝试在将URL更改为文件后使用resourceFile.getName()。

URL resourceURL = classLoader.getResource(..);
File resourceFile = new File(new URL(resourceURL).toURI());
String fullPath = resourceFile.getName();

答案 1 :(得分:0)

  

它会引发异常。我想这是因为它需要一个文件和   不是目录

如果是这种情况,您可以提供文件而不是目录。要获得绝对路径,请尝试如下

       String dirPath = "C:\\Softwares";

        File dir = new File( dirPath );

        for ( String fileName : dir.list() ) {

            File file = new File( dirPath + "\\" + fileName );

            if ( file.isFile() ) {

                // System.out.println( file.getAbsolutePath() );
                String dir = classLoader.getResource( file.getAbsolutePath() ).toString();
            }
        }