我正在努力获取我放置在 Web 根文件夹中的 fileroot
目录的相对路径。我试图从类访问此目录以通过 Web 服务
返回其中的文件名。该文件夹包含图像和 XML 文件。
这是从展开的 .WAR
文件中看到的我的项目结构 -
我的项目
- 文件根目录
- CSS
- ...
- WEB-INF
|--类(class)
当我在本地驱动器上使用硬编码的绝对路径来读取目录中的文件时,我能够让它工作。但是,我需要它在不可能使用绝对路径的 Web 服务器上工作。
我需要从我的类(class)中访问这个文件夹,以便能够对 XML 进行一些处理,同时能够为网页提供该文件夹中的图像。
这是为读取目录编写的代码-
package com.xyz.executor;
import java.io.File;
import java.io.FileFilter;
import java.util.ArrayList;
/**
*
* @author AJ
*/
public class GetDirectories {
public String basePath = "/fileroot";
public String directoryName;
public GetDirectories() {
}
public GetDirectories(String DirectoryName) {
this.directoryName = DirectoryName;
basePath = basePath + "/" + directoryName;
}
public ArrayList<String> read() {
ArrayList<String> DirectoryList = new ArrayList<>();
try {
File f = new File(basePath); // current directory
FileFilter directoryFilter = new FileFilter() {
public boolean accept(File file) {
return file.isDirectory();
}
};
File[] files = f.listFiles(directoryFilter);
for (File file : files) {
if (file.isDirectory()) {
System.out.print("directory:");
DirectoryList.add(file.getName());
} else {
System.out.print(" file:");
}
System.out.println(file.getName());
}
} catch (Exception e) {
System.out.println("Exception occurred (GetDirectories) : " + e.toString());
e.printStackTrace();
System.out.println("**************************");
}
return DirectoryList;
}
}
当 f.listFiles(directoryFilter)
返回 null
时,我得到了一个空指针异常
,因此我怀疑路径。
问题 1,如何获取类文件中的应用程序根路径?
问题 2,将目录放在应用程序根目录中是否正确?或者我应该把它放在驱动器上的另一个位置吗?
P.S: 我之前写了一个 Web 应用程序,它读取存储在类似于 this question 的类路径中的 .properties
文件。 .但是,这对于大量文件来说似乎不是一个好主意
最佳答案
在应用程序服务器上,默认路径是启动服务器的路径(即启动服务器时所在的文件夹)或 bin
文件夹。所以目录和文件应该在里面。一种快速检查您所在路径的方法是打印或记录 f.getAbsolutePath()
的结果,这将告诉您服务器默认指向哪个文件夹。
您正常打开文件 (new File(...)
) 而不是作为资源,因此不使用资源路径或类路径。
在处理应用程序服务器时,最好避免使用默认路径,因为它很容易更改。要么有一个系统属性或等效的定义文件将被搜索的位置,要么,如果你要发送你想与应用程序一起阅读的文件,将它放在 WAR 中并将其作为资源打开:
YourClass.class.getResourceAsStream("/...");
或
YourClass.class.getResource("/...");
关于java - 应用程序根目录中的相对路径 - Java Web 应用程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31002470/