题
在我的 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.jpg
在src/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()));