文件在项目A的类中读取并在项目B中调用此类

时间:2014-09-24 05:33:45

标签: java eclipse file filepath

我有2个项目。项目A和项目B.

在Project A中我有一个MyClass类,它有一个方法说:readMyFile()从某个xyz路径读取文件。

现在我正在尝试从Project B中的类调用readMyFile()。我收到错误,指出尝试读取的文件不存在。

如何确保项目A中MyClass中的readFile()读取的文件在Project B中也可见?

1 个答案:

答案 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()返回URLClass.getResourceAsStream()返回InputStream,使用引擎盖下的网址。还有其他使用ClassLoader的变体。有关其他变体,请参阅ClassClassLoader Apis。