当我正在使用的第三方库尝试访问文件时,我收到"错误打开...文件...(没有这样的文件或目录)",即使我知道该文件在WAR中.我已经尝试了打包(.war)和"爆炸"(目录)部署,文件肯定在那里.我也尝试过设置完全权限.它是在Unix(Ubuntu)上.文件是war/dict/index.sense,错误是"dict/index.sense(没有这样的文件或目录)".
当它作为来自Eclipse的GWT应用程序在托管模式下运行时,它在我的Windows计算机上运行正常,而不是在我将其传输到Unix机器进行部署时.
我的问题是:有没有人经历过这个和/或我应该考虑相对路径的差异,即在战争中相对文件访问的根路径是什么?
在读取资源时,不应该依赖文件IO中的相对路径.工作目录取决于应用程序的启动方式.你完全没有控制权.始终在文件IO中使用绝对路径.
正常的方法是:
将资源放在类路径中或将其路径添加到类路径中.然后您可以通过类加载器获取它,如下所示:
String classPathLocation = "filename.ext";
ClassLoader classLoader = Thread.currentThread().getContextClassLoader();
InputStream input = classLoader.getResourceAsStream(classPathLocation);
// ...
Run Code Online (Sandbox Code Playgroud)
请注意类加载器和资源的获取方式.你不应该从当前的类中获取它getClass().getResourceAsStream().在WAR中,可能存在多个类加载器的方法.当前类的类加载器可能不知道所需的资源本身,即上下文.
将资源放在webcontent中(WEB-INF文件夹所在的位置和所有其他公共Web资源).然后你可以获得如下的绝对路径,你可以继续在通常的文件IO代码中使用它:
String relativeWebPath = "/filename.ext";
String absoluteDiskPath = getServletContext().getRealPath(relativeWebPath);
InputStream input = new FileInputStream(absoluteDiskPath);
// ...
Run Code Online (Sandbox Code Playgroud)
请注意,这仅在WAR扩展时有效,否则只会返回null.
| 归档时间: |
|
| 查看次数: |
2930 次 |
| 最近记录: |