如何从资源文件夹加载文件?
我的项目有以下结构:
/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));