【问题标题】:Am I accessing these resource files in java incorrectly?我是否在 java 中错误地访问了这些资源文件?
【发布时间】:2014-11-20 05:13:53
【问题描述】:

我有两节课。一个是公共库,另一个是使用该库的客户端。

该库的结构如下:

public class Library
{



    public Library()
    {
         String pathToResourceA="src/main/resources/A.xls";// A.xls is present within resources
         String key="apples";

         Resource res= loadResourceBasedOnDoc(pathToResource,key);
         ...//process resource

    }

}

对应的测试类

public class LibraryTest
{
    @Test
    public void testLibrary()
    {
        new Library();// works as expected- the test passes and the resource is loaded.//ie. A.xls is found in the right place

    }

}

但是,当我尝试通过以下方式从客户端访问库时

import packagename.Library

public class Client{

    Library lib;
    public Client()
    {
        lib= new Library();// throws a FileNotFoundException!

    }

}

我得到一个 FileNotFoundException。我猜这与在 A 类中为 pathToResourceA 定义正确的值有关,但无法弄清楚它是什么。任何想法将不胜感激。谢谢!

loadResourcesBasedonDoc 的代码

protected Resource loadResourceBasedOnDoc(String filename,String password)
{
InputStream in = null;
        try {
            in = new FileInputStream(filename);
    //further in is processed...

【问题讨论】:

  • 能否贴出 loadResourceBasedOnDoc 方法的代码?
  • @EJK 我已经添加了代码在高层次上的作用。
  • 您的评论“A.xls 存在于资源中”。你能详细说明一下吗? A.xls 是文件系统上的文件,还是包含在库的 JAR 文件中的文件?
  • A.xls 是文件系统上的一个文件。 src/main/resources/A.xls 是相对于Library 的文件路径。整个想法是在多个项目中没有A.xls,并且只在库中。

标签: java eclipse path


【解决方案1】:

问题是你使用的是相对文件路径:

String pathToResourceA="src/main/resources/A.xls";// A.xls is present within resources

然后在 loadResourceBasedOnDoc 方法中处理如下:

in = new FileInputStream(filename);

此调用在文件系统上查找文件 (src/main/resources/A.xls)。因为路径是相对的,所以它会在相对于当前工作目录的目录中查找文件。在您的单元测试中,当前工作目录可能是启动测试的目录。假设这是您项目的根目录,测试可能会在您项目的文件系统上找到 A.xls。

为了解决这个问题,我建议在 loadResourceBasedOnDoc 中使用完整路径名,如下所示:

String programLaunchDir = System.getProperty("user.dir")
in = new FileInputStream(programLaunchDir + File.separator  + filename);

user.dir 系统属性应该是当前工作目录。因此,如果您可以强制从该目录启动程序,那么您就一切就绪。否则,您可能希望将程序包装在一个批处理文件或 shell 脚本中,以便将目录传递给程序。

【讨论】:

  • 有道理。但是,我认为更好的方法是在初始调用中传递loadResourceBasedOnDoc(rootPath+"/"+filename,key)。另外,我的问题的全部要点是问如何可以为rootPath 获得正确的值。您可以将其添加到答案中并确认我的方法吗?谢谢!
猜你喜欢
  • 1970-01-01
  • 2020-08-17
  • 1970-01-01
  • 1970-01-01
  • 2012-05-23
  • 2011-05-04
  • 1970-01-01
相关资源
最近更新 更多