我有2个项目。项目A和项目B.
在Project A中我有一个MyClass类,它有一个方法说:readMyFile()从某个xyz路径读取文件。
现在我正在尝试从Project B中的类调用readMyFile()。我收到错误,指出尝试读取的文件不存在。
如何确保项目A中MyClass中的readFile()读取的文件在Project B中也可见?
答案 0 :(得分:0)
评论扩展答案:
不要将jar资源读为
中调用该类/方法File
。这可能是你的第一个问题,如果这就是你正在做的事情。使用getClass().getResourceAsStream()
或其中一个变体将其作为资源(通过URL)读取。其次,我不会尝试使用依赖于jar B的路径直接从A读取文件。而只是在项目B中创建一个将提供其资源的类。然后从项目A
例如
ProjectB
src
resources
images
background.png
text
stackoverflow.txt
mypackage
ResourceFinder.java
ResourceFinder.java
public class ResourceFinder {
public static final String BACKGROUND_IMG = "background.png";
public static final Sting STACKOVERFLOW_TXT = "stackoverflow.txt";
// maybe you'll want to do some try/catching null checks
// I'm being lazy
public static BufferedImage getImage(String fileName ) throws Exception {
URL url = ResourceFinder.class.getResource("/images/" + fileName);
BufferedImage image = ImageIO.read(url);
return image;
}
public static InputStream getTextFile(String file) throws Exception {
InputStream is = ResourceFinder.class.getResourceAsStream(
"/text/" + fileName);
return is;
}
}
然后在你的项目A中,你可以做一些像
这样的事情BufferedImage image = ResourceFinder.getImage(ResourceFinder.BACKROUND_IMG);
or
InputStream is = ResourceFinder.getTextFile(ResourceFinder.STACKOVERFLOW_TXT);
BufferedReader reader = new BufferedReader(new InputStreamReader(is);
请注意,当您使用File
或其任何FileXxx
变体时,您正在从文件系统中读取。因此,一旦文件被“震动”,您使用的任何硬编码路径都可能无法工作,因为位置不再相同。这就是为什么我们通过网址阅读它,使用Class.getResource()
返回URL
或Class.getResourceAsStream()
返回InputStream
,使用引擎盖下的网址。还有其他使用ClassLoader
的变体。有关其他变体,请参阅Class和ClassLoader Apis。