在我的 Java 应用程序中,我需要获取一些文件和目录。

这是程序结构:

./main.java
./package1/guiclass.java
./package1/resources/resourcesloader.java
./package1/resources/repository/modules/   -> this is the dir I need to get
./package1/resources/repository/SSL-Key/cert.jks    -> this is the file I need to get

guiclass 加载资源加载器类,它将加载我的资源(目录和文件)。

至于文件,我尝试过

resourcesloader.class.getClass().getResource("repository/SSL-Key/cert.jks").toString()

才能得到真正的路径,但是这种方式行不通。

我不知道如何做目录。

有帮助吗?

解决方案

供应相对于类加载器,而不是你得到从装入器的类路径。例如:

resourcesloader.class.getClassLoader().getResource("package1/resources/repository/SSL-Key/cert.jks").toString();

其他提示

我与使用getClass().getResource("filename.txt")方法中的问题。 在阅读Java文档的说明,如果你的资源是不是在同一个包中的类,你正试图从访问资源,那么你必须给它相对路径开始'/'。建议的策略是把你的资源文件的根目录下的“资源”文件夹下。因此,举例来说,如果你有结构:

src/main/com/mycompany/myapp

,那么您可以在推荐的行家添加一个资源文件夹:

src/main/resources

此外可以在资源文件夹的子文件夹添加

src/main/resources/textfiles

和说,你的文件被称为myfile.txt所以你必须

src/main/resources/textfiles/myfile.txt

现在这里是愚蠢的路径问题进来。说你有你的com.mycompany.myapp package一类,你想从你的资源文件夹访问myfile.txt文件。有人说,你需要给:

"/main/resources/textfiles/myfile.txt" path

"/resources/textfiles/myfile.txt"

这两种都是错误的。后我跑mvn clean compile,文件和文件夹中复制:

myapp/target/classes 

文件夹。但是,资源文件夹是不存在的,只是在资源文件夹中的文件夹。所以,你有:

myapp/target/classes/textfiles/myfile.txt

myapp/target/classes/com/mycompany/myapp/*

所以正确的路径给到getClass().getResource("")方法是:

"/textfiles/myfile.txt"

这里是:

getClass().getResource("/textfiles/myfile.txt")

这将不再返回null,但将返回你的类。 我希望这可以帮助别人。奇怪的是我,那"resources"文件夹是不可复制的,以及,但只有直接在"resources"文件夹中的子文件夹和文件。这似乎符合逻辑的我,"resources"文件夹也将下"myapp/target/classes"找到

为了给那些不像其他人那样快速掌握这一点的人提供更多信息,我想提供我的场景,因为它的设置略有不同。我的项目设置为以下目录结构(使用 Eclipse):

Project/
  src/                // application source code
    org/
      myproject/
        MyClass.java
  test/               // unit tests
  res/                // resources
    images/           // PNG images for icons
      my-image.png
    xml/              // XSD files for validating XML files with JAXB
      my-schema.xsd
    conf/             // default .conf file for Log4j
      log4j.conf
  lib/                // libraries added to build-path via project settings

我从以下位置加载资源时遇到问题 资源 目录。我希望所有资源与源代码分开(仅用于管理/组织目的)。所以,我要做的就是添加 资源 目录到 构建路径 然后通过以下方式访问资源:

static final ClassLoader loader = MyClass.class.getClassLoader();

// in some function
loader.getResource("images/my-image.png");
loader.getResource("xml/my-schema.xsd");
loader.getResource("conf/log4j.conf");

笔记:/ 从资源字符串的开头省略,因为我正在使用 类加载器.getResource(String) 代替 类.getResource(String).

@GianCarlo: 你可以尝试调用系统属性user.dir,会给你Java项目的根目录,然后执行此路径追加到例如您的相对路径:

String root = System.getProperty("user.dir");
String filepath = "/path/to/yourfile.txt"; // in case of Windows: "\\path \\to\\yourfile.txt
String abspath = root+filepath;



// using above path read your file into byte []
File file = new File(abspath);
FileInputStream fis = new FileInputStream(file);
byte []filebytes = new byte[(int)file.length()];
fis.read(filebytes);

当使用“的getResource”上一类,相对路径被解析基于所述包中的类是,当你使用“的getResource”上的类加载器,相对路径是基于根文件夹解决。

如果您使用绝对路径,既“的getResource”方法将在根文件夹开始。

有关使用eclipse +行家那些。假设您尝试访问该文件images/pic.jpgsrc/main/resources。做这种方式:

ClassLoader loader = MyClass.class.getClassLoader();
File file = new File(loader.getResource("images/pic.jpg").getFile());

是完全正确的,但可能会导致一个空指针异常。好像日食不承认在Maven目录结构中的文件夹作为源文件夹的时候了。通过删除并从项目的源文件夹列表中的文件夹src/main/resources并把它背(项目>属性> Java构建路径>源>删除/添加文件夹),我是能够解决这个问题。

resourcesloader.class.getClass()

可细分为:

Class<resourcesloader> clazz = resourceloader.class;
Class<Class> classClass = clazz.getClass();

这意味着你在尝试使用引导类加载资源。

相反,你可能想是这样的:

resourcesloader.class.getResource("repository/SSL-Key/cert.jks").toString()

如果只javac的警告,呼吁非静态上下文静态方法...

Doe的下面的工作?

resourcesloader.class.getClass().getResource("/package1/resources/repository/SSL-Key/cert.jks")

有一个原因,你不能指定包括包的完整路径?

与两个答案如上所述去。第一种

resourcesloader.class.getClassLoader().getResource("package1/resources/repository/SSL-Key/cert.jks").toString();
resourcesloader.class.getResource("repository/SSL-Key/cert.jks").toString()

应该是一个和同样的事情?

我发上@ jonathan.cone的一个衬里一个小的修改(通过添加.getFile()),以避免零指示字例外,并设置数据目录路径。下面是我工作:

String realmID = new java.util.Scanner(new java.io.File(RandomDataGenerator.class.getClassLoader().getResource("data/aa-qa-id.csv").getFile().toString())).next();

使用这样的:

resourcesloader.class.getClassLoader().getResource("/path/to/file").**getPath();**

为了取得该文件真实路径,你可以试试这个:

URL fileUrl = Resourceloader.class.getResource("resources/repository/SSL-Key/cert.jks");
String pathToClass = fileUrl.getPath;    

的ResourceLoader是这里类名。 “资源中心/存储库/ SSL密钥/ cert.jks”是将文件的相对路径。如果你有在./package1/java您guiclass与文件夹结构的其余部分保持,你会采取“../resources/repository/SSL-Key/cert.jks”的,因为定义相对路径规则的相对路径。

这样你就可以读取BufferedReader中的文件。不要使用字符串来识别文件的路径,因为如果你有空格或没有英文字母在你的路径一些字符,你会得到的问题,该文件将不会被发现。

BufferedReader bufferedReader = new BufferedReader(
                        new InputStreamReader(fileUrl.openStream()));
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top