【问题标题】:Java: Can't read a file in my project directory?Java:无法读取我的项目目录中的文件?
【发布时间】:2014-01-13 09:13:17
【问题描述】:

我正在构建一个 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 项目(基本上是一个带有一些额外 .jar 的动态 Web 项目)部署到 tomcat 并使用我的浏览器访问 thVe aadin 项目

我所看到的:

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

我检查过的内容:

  • 该文件肯定会与项目的其余部分一起部署到 tomcat
  • 在 webapps 文件夹之外,我尝试导入的文件在部署后可通过浏览器访问(即 Localhost/myProject/MyFile.html)
  • Tomcat 安装正常(这是全新安装,可与此问题/其他项目一起使用)

我尝试过的

  • 使用相对 URL,或仅使用文件名(即 New File("../webapps/vaadin/layouts/MyFile.html"))
  • 使用项目目录的绝对路径
  • 使用部署目录的绝对路径(如上)
  • 将文件放在其他地方(阅读:项目中每个可能的位置)

再次,我试图简单地读取文件 MyFile.html 作为输入流。我在做什么错/忽略?

感谢您的宝贵时间。

【问题讨论】:

  • 将文件拖放到命令提示符中,以便获取路径,或在 Windows 资源管理器中右击并获取属性(我看到 c: 所以它的 windows?),然后使用记事本/文本板将所有 \ 替换为 / 或转义 \\

标签: java tomcat vaadin


【解决方案1】:

使用指向 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】:

    只是为了使它更便携:您是否考虑过将您的模板放入您的 classpath 中?像

    yourApp/WEB-INF/classes/templates/layoutsinteractionDetailsTabLayout.html
    

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

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

    【讨论】:

    • 这当然是我会做的事情,但我想在尝试其他方法之前让这种非常基本的“读取文件”方法发挥作用。
    • 在这种情况下,可能您正在读取的目录太不稳定或临时性太强,或者容易受到 Eclipse 的影响。您是否尝试过将您的模板复制到您机器中的一个知名目录并尝试使用该路由的代码?
    【解决方案3】:

    如果您真的想将此文件用作 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 目录中打扰它,而是将它放在你的类路径资源中并使用 ClassLoader 访问它.

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-10-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-07-06
      • 1970-01-01
      相关资源
      最近更新 更多