如何从资源文件夹加载文件?

我的项目有以下结构:

/src/main/java/ /src/main/resources/ /src/test/java/ /src/test/resources/ 

我在/src/test/resources/test.csv有一个文件,我想从/src/test/java/MyTest.java的unit testing中加载文件

我有这个代码没有工作。 它抱怨“没有这样的文件或目录”。

 BufferedReader br = new BufferedReader (new FileReader(test.csv)) 

我也试过这个

 InputStream is = (InputStream) MyTest.class.getResourcesAsStream(test.csv)) 

这也是行不通的。 它返回null 。 我正在使用Maven来构build我的项目。

尝试下一个:

 ClassLoader classloader = Thread.currentThread().getContextClassLoader(); InputStream is = classloader.getResourceAsStream("test.csv"); 

如果上述不起作用,则各个项目都添加了以下类: ClassLoaderUtil (code here )。

尝试:

 InputStream is = MyTest.class.getResourceAsStream("/test.csv"); 

IIRC getResourceAsStream()默认是相对于类的包。

以下是使用番石榴的一个快速解决scheme:

 import com.google.common.base.Charsets; import com.google.common.io.Resources; public String readResource(final String fileName, Charset charset) throws IOException { return Resources.toString(Resources.getResource(fileName), charset); } 

用法:

 String fixture = this.readResource("filename.txt", Charsets.UTF_8) 

尝试Spring项目上的stream程代码

 ClassPathResource resource = new ClassPathResource("fileName"); InputStream inputStream = resource.getInputStream(); 

或在非春季项目

  ClassLoader classLoader = getClass().getClassLoader(); File file = new File(classLoader.getResource("fileName").getFile()); InputStream inputStream = new FileInputStream(file); 
 ClassLoader loader = Thread.currentThread().getContextClassLoader(); InputStream is = loader.getResourceAsStream("test.csv"); 

如果使用上下文ClassLoader来查找资源,那么肯定会导致应用程序性能的降低。

现在我正在说明从Maven创build的资源目录中读取字体的源代码,

SCR /主/资源/ calibril.ttf

在这里输入图像描述

 Font getCalibriLightFont(int fontSize){ Font font = null; try{ URL fontURL = OneMethod.class.getResource("/calibril.ttf"); InputStream fontStream = fontURL.openStream(); font = new Font(Font.createFont(Font.TRUETYPE_FONT, fontStream).getFamily(), Font.PLAIN, fontSize); fontStream.close(); }catch(IOException | FontFormatException ief){ font = new Font("Arial", Font.PLAIN, fontSize); ief.printStackTrace(); } return font; } 

它为我工作,并希望整个源代码也将帮助你,享受!

当不运行Maven-build jar时,代码是否工作,例如从IDE运行时? 如果是这样,请确保文件实际上包含在jar中。 资源文件夹应该包含在pom文件的<build><resources>

以下类可用于从classpath加载resource ,并且在给定filePath存在问题的情况下也会收到适合的错误消息。

 import java.io.InputStream; import java.nio.file.NoSuchFileException; public class ResourceLoader { private String filePath; public ResourceLoader(String filePath) { this.filePath = filePath; if(filePath.startsWith("/")) { throw new IllegalArgumentException("Relative paths may not have a leading slash!"); } } public InputStream getResource() throws NoSuchFileException { ClassLoader classLoader = this.getClass().getClassLoader(); InputStream inputStream = classLoader.getResourceAsStream(filePath); if(inputStream == null) { throw new NoSuchFileException("Resource file not found. Note that the current directory is the source folder!"); } return inputStream; } } 

getResource()与只在src/main/resources放置的资源文件正常工作。 要得到src/main/resources以外的path的文件,你需要明确地创buildsrc/test/java

下面的例子可能会帮助你

 import java.io.BufferedReader; import java.io.FileReader; import java.io.IOException; import java.net.URISyntaxException; import java.net.URL; public class Main { public static void main(String[] args) throws URISyntaxException, IOException { URL location = Main.class.getProtectionDomain().getCodeSource().getLocation(); BufferedReader br = new BufferedReader(new FileReader(location.getPath().toString().replace("/target/classes/", "/src/test/java/youfilename.txt"))); } } 

我没有任何引用“class”或“ClassLoader”的工作。

假设我们有三个场景,文件'example.file'的位置和工作目录(您的应用程序执行的位置)是home / mydocuments / program / projects / myapp:

a)子文件夹后裔到工作目录:myapp / res / files / example.file

b)不属于工作目录的子文件夹:projects / files / example.file

b2)另一个不属于工作目录的子文件夹:program / files / example.file

c)根文件夹:home / mydocuments / files / example.file(Linux;在Windows中用Creplacehome /)

1)获取正确的path:a) String path = "res/files/example.file"; b) String path = "../projects/files/example.file" String path = "/home/mydocuments/files/example.file" String path = "../projects/files/example.file" b2) String path = "../../program/files/example.file" String path = "/home/mydocuments/files/example.file" String path = "../../program/files/example.file" c) String path = "/home/mydocuments/files/example.file"

基本上,如果它是一个根文件夹,用一个前导斜杠启动path名。 如果它是一个子文件夹,则path名称前不能有斜杠。 如果子文件夹不属于工作目录,则必须使用“../”对其进行光盘操作。 这告诉系统上去一个文件夹。

2)通过传递正确的path创build一个File对象:

 File file = new File(path); 

3)你现在很好去:

 BufferedReader br = new BufferedReader(new FileReader(file));