Java:无法读取项目目录中的文件?

时间:2014-01-13 09:13:17

标签: java tomcat vaadin

我正在构建一个Vaadin(基本上是编译为html / javascript的Java)项目,并且我正在尝试导入模板(基本上是一个HTML文件)。考虑到所有意图和目的,我只是将文件作为输入流导入。这是违规代码:

File file = new File("C:/JavaProjects/VaadinSpikeWorkspace/.metadata/.plugins/org.eclipse.wst.server.core/tmp0/wtpwebapps/CISTVaadinClient/VAADIN/themes/layoutsinteractionDetailsTabLayout.html");
InputStream is = null;
CustomLayout custom = null;
try {
    is = new FileInputStream(file);
} catch (FileNotFoundException e1) {
    System.out.println("mark 1");
    e.printStackTrace();
}

try {
    custom = new CustomLayout(is);
} catch (IOException e) {
    System.out.println("mark 2");
e.printStackTrace(); 
}

我在做什么:

  • 将Vaadin项目(基本上是一个带有一些额外.jars的动态Web项目)部署到tomcat并使用我的浏览器访问该项目

我所看到的:

  • 浏览器中的空白屏幕
  • 找不到文件例外(即“标记1”)
  • 结果:IOException(即“Mark 2”)

我检查了什么:

  • 该文件肯定会与项目的其余部分一起部署到tomcat
  • 在webapps文件夹之外,我试图导入的文件一旦部署就可以通过浏览器获得(即Localhost / myProject / MyFile.html)
  • Tomcat安装很好(这是一个全新的安装,可以解决此问题之外的这个/其他项目)

我尝试了什么

  • 使用相对网址,或仅使用文件名称(即新文件(“../webapps/vaadin/layouts/MyFile.html”))
  • 使用项目目录的绝对路径
  • 使用部署目录的绝对路径(如上所述)
  • 将文件放在其他位置(阅读:项目中的每个可能位置)

同样,我试图简单地将文件MyFile.html作为输入流读取。我做错了什么/忽视?

感谢您的时间。

3 个答案:

答案 0 :(得分:0)

只是为了让它更具便携性:您是否考虑过将模板带入classpath?像

这样的东西
yourApp/WEB-INF/classes/templates/layoutsinteractionDetailsTabLayout.html

这样,你只需要这行代码,假设你进入了Servlet或Spring Controller或Struts 1/2动作或任何名为YourClass的行为:

InputStream is = YourClass.class.getClassLoader().getResourceAsStream("templates/layoutsinteractionDetailsTabLayout.html");

答案 1 :(得分:0)

当使用指向WebContent目录的VaadinService(内部有META-INF,VAADIN和WEB-INF)时,我没有读取文件的问题。如果它在测试环境中运行,那么VaadinService不可用,所以我使用这样的代码:

private static final String BASEDIR;
static {
    if (VaadinService.getCurrent() != null) {
        BASEDIR = VaadinService.getCurrent().getBaseDirectory().getAbsolutePath();
    } else {
        BASEDIR = "WebContent";
    }
}

然后导航到VAADIN文件夹只需使用

BASEDIR+="/VAADIN/restOfYourPath"

答案 2 :(得分:0)

如果您真的想将此文件用作HTML模板,那么利用Vaadin对此的支持会更好。他们有CustomLayout从您的主题加载HTML模板。

您的模板将进入如下文件夹:

VAADIN/themes/mytheme/layout/layoutsinteractionDetailsTabLayout.html

请注意,mytheme是主题的名称,layout是主题中特别认可的Vaadin目录。

您的自定义组件将如下所示:

public class InteractionDetailsTabLayout extends CustomLayout {

  private static final String TEMPLATE = "layoutsinteractionDetailsTabLayout";

  public InteractionDetailsTabLayout() {
    super(TEMPLATE);
  }

}

请注意,超级构造函数参数会排除目录和文件后缀。

如果您确实想要在webapp 中加载文件,请不要在VAADIN目录中使用它,而是将其放在类路径资源中并使用{访问它{3}}