1.如何獲得目前檔案路徑
常用:
(1).Test.class.getResource("")
得到的是目前類FileTest.class檔案的URI目錄。不包括自己!
(2).Test.class.getResource("/")
得到的是目前的classpath的絕對URI路徑。
(3).Thread.currentThread().getContextClassLoader().getResource("")
得到的也是目前ClassPath的絕對URI路徑。
(4).Test.class.getClassLoader().getResource("")
(5).ClassLoader.getSystemResource("")
盡量不要使用相對于System.getProperty("user.dir")目前使用者目錄的相對路徑,後面可以看出得出結果五花八門。
(6) new File("").getAbsolutePath()也可用。
2.Web伺服器
(1).Tomcat
在類中輸出System.getProperty("user.dir");顯示的是%Tomcat_Home%/bin
(2).Resin
不是你的JSP放的相對路徑,是JSP引擎執行這個JSP編譯成SERVLET
的路徑為根.比如用建立檔案法測試File f = new File("a.htm");
這個a.htm在resin的安裝目錄下
(3).如何讀檔案
使用ServletContext.getResourceAsStream()就可以
(4).獲得檔案真實路徑
String file_real_path=ServletContext.getRealPath("mypath/filename");
不建議使用request.getRealPath("/");
3.檔案操作的類,不建議使用,可以使用commons io類
import java.io.*;
import java.net.*;
import java.util.*;
/**
* 此類中封裝一些常用的檔案操作。
* 所有方法都是靜态方法,不需要生成此類的執行個體,
* 為避免生成此類的執行個體,構造方法被申明為private類型的。
* @since 0.1
*/
public class FileUtil {
/**
* 私有構造方法,防止類的執行個體化,因為工具類不需要執行個體化。
*/
private FileUtil() {
}
* 修改檔案的最後通路時間。
* 如果檔案不存在則建立該檔案。
* <b>目前這個方法的行為方式還不穩定,主要是方法有些資訊輸出,這些資訊輸出是否保留還在考
慮中。</b>
* @param file 需要修改最後通路時間的檔案。
* @since 0.1
public static void touch(File file) {
long currentTime = System.currentTimeMillis();
if (!file.exists()) {
System.err.println("file not found:" + file.getName());
System.err.println("Create a new file:" + file.getName());
try {
if (file.createNewFile()) {
// System.out.println("Succeeded!");
}
else {
// System.err.println("Create file failed!");
}
catch (IOException e) {
// System.err.println("Create file failed!");
e.printStackTrace();
}
boolean result = file.setLastModified(currentTime);
if (!result) {
// System.err.println("touch failed: " + file.getName());
* @param fileName 需要修改最後通路時間的檔案的檔案名。
public static void touch(String fileName) {
File file = new File(fileName);
touch(file);
* @param files 需要修改最後通路時間的檔案數組。
public static void touch(File[] files) {
for (int i = 0; i < files.length; i++) {
touch(files);
* @param fileNames 需要修改最後通路時間的檔案名數組。
public static void touch(String[] fileNames) {
File[] files = new File[fileNames.length];
for (int i = 0; i < fileNames.length; i++) {
files = new File(fileNames);
touch(files);
* 判斷指定的檔案是否存在。
* @param fileName 要判斷的檔案的檔案名
* @return 存在時傳回true,否則傳回false。
public static boolean isFileExist(String fileName) {
return new File(fileName).isFile();
* 建立指定的目錄。
* 如果指定的目錄的父目錄不存在則建立其目錄書上所有需要的父目錄。
* <b>注意:可能會在傳回false的時候建立部分父目錄。</b>
* @param file 要建立的目錄
* @return 完全建立成功時傳回true,否則傳回false。
public static boolean makeDirectory(File file) {
File parent = file.getParentFile();
if (parent != null) {
return parent.mkdirs();
return false;
* @param fileName 要建立的目錄的目錄名
public static boolean makeDirectory(String fileName) {
return makeDirectory(file);
* 清空指定目錄中的檔案。
* 這個方法将盡可能删除所有的檔案,但是隻要有一個檔案沒有被删除都會傳回false。
* 另外這個方法不會疊代删除,即不會删除子目錄及其内容。
* @param directory 要清空的目錄
* @return 目錄下的所有檔案都被成功删除時傳回true,否則傳回false.
public static boolean emptyDirectory(File directory) {
boolean result = false;
File[] entries = directory.listFiles();
for (int i = 0; i < entries.length; i++) {
if (!entries.delete()) {
result = false;
return true;
* @param directoryName 要清空的目錄的目錄名
* @return 目錄下的所有檔案都被成功删除時傳回true,否則傳回false。
public static boolean emptyDirectory(String directoryName) {
File dir = new File(directoryName);
return emptyDirectory(dir);
* 删除指定目錄及其中的所有内容。
* @param dirName 要删除的目錄的目錄名
* @return 删除成功時傳回true,否則傳回false。
public static boolean deleteDirectory(String dirName) {
return deleteDirectory(new File(dirName));
* @param dir 要删除的目錄
public static boolean deleteDirectory(File dir) {
if ( (dir == null) || !dir.isDirectory()) {
throw new IllegalArgumentException("Argument " + dir +
" is not a directory. ");
File[] entries = dir.listFiles();
int sz = entries.length;
for (int i = 0; i < sz; i++) {
if (entries.isDirectory()) {
if (!deleteDirectory(entries)) {
return false;
else {
if (!entries.delete()) {
if (!dir.delete()) {
return false;
* 傳回檔案的URL位址。
* @param file 檔案
* @return 檔案對應的的URL位址
* @throws MalformedURLException
* @since 0.4
* @deprecated 在實作的時候沒有注意到File類本身帶一個toURL方法将檔案路徑轉換為URL。
* 請使用File.toURL方法。
public static URL getURL(File file) throws MalformedURLException {
String fileURL = "file:/" + file.getAbsolutePath();
URL url = new URL(fileURL);
return url;
* 從檔案路徑得到檔案名。
* @param filePath 檔案的路徑,可以是相對路徑也可以是絕對路徑
* @return 對應的檔案名
public static String getFileName(String filePath) {
File file = new File(filePath);
return file.getName();
* 從檔案名得到檔案絕對路徑。
* @param fileName 檔案名
* @return 對應的檔案路徑
public static String getFilePath(String fileName) {
return file.getAbsolutePath();
* 将DOS/Windows格式的路徑轉換為UNIX/Linux格式的路徑。
* 其實就是将路徑中的"\"全部換為"/",因為在某些情況下我們轉換為這種方式比較友善,
* 某中程度上說"/"比"\"更适合作為路徑分隔符,而且DOS/Windows也将它當作路徑分隔符。
* @param filePath 轉換前的路徑
* @return 轉換後的路徑
public static String toUNIXpath(String filePath) {
return filePath.replace('\\', '/');
* 從檔案名得到UNIX風格的檔案絕對路徑。
* @return 對應的UNIX風格的檔案路徑
* @see #toUNIXpath(String filePath) toUNIXpath
public static String getUNIXfilePath(String fileName) {
return toUNIXpath(file.getAbsolutePath());
* 得到檔案的類型。
* 實際上就是得到檔案名中最後一個“.”後面的部分。
* @return 檔案名中的類型部分
* @since 0.5
public static String getTypePart(String fileName) {
int point = fileName.lastIndexOf('.');
int length = fileName.length();
if (point == -1 || point == length - 1) {
return "";
else {
return fileName.substring(point + 1, length);
public static String getFileType(File file) {
return getTypePart(file.getName());
* 得到檔案的名字部分。
* 實際上就是路徑中的最後一個路徑分隔符後的部分。
* @return 檔案名中的名字部分
public static String getNamePart(String fileName) {
int point = getPathLsatIndex(fileName);
if (point == -1) {
return fileName;
else if (point == length - 1) {
int secondPoint = getPathLsatIndex(fileName, point - 1);
if (secondPoint == -1) {
if (length == 1) {
return fileName;
return fileName.substring(0, point);
return fileName.substring(secondPoint + 1, point);
return fileName.substring(point + 1);
* 得到檔案名中的父路徑部分。
* 對兩種路徑分隔符都有效。
* 不存在時傳回""。
* 如果檔案名是以路徑分隔符結尾的則不考慮該分隔符,例如"/path/"傳回""。
* @return 父路徑,不存在或者已經是父目錄時傳回""
public static String getPathPart(String fileName) {
return "";
return fileName.substring(0, secondPoint);
return fileName.substring(0, point);
* 得到路徑分隔符在檔案路徑中首次出現的位置。
* 對于DOS或者UNIX風格的分隔符都可以。
* @param fileName 檔案路徑
* @return 路徑分隔符在路徑中首次出現的位置,沒有出現時傳回-1。
public static int getPathIndex(String fileName) {
int point = fileName.indexOf('/');
point = fileName.indexOf('\\');
return point;
* 得到路徑分隔符在檔案路徑中指定位置後首次出現的位置。
* @param fromIndex 開始查找的位置
* @return 路徑分隔符在路徑中指定位置後首次出現的位置,沒有出現時傳回-1。
public static int getPathIndex(String fileName, int fromIndex) {
int point = fileName.indexOf('/', fromIndex);
point = fileName.indexOf('\\', fromIndex);
* 得到路徑分隔符在檔案路徑中最後出現的位置。
* @return 路徑分隔符在路徑中最後出現的位置,沒有出現時傳回-1。
public static int getPathLsatIndex(String fileName) {
int point = fileName.lastIndexOf('/');
point = fileName.lastIndexOf('\\');
* 得到路徑分隔符在檔案路徑中指定位置前最後出現的位置。
* @return 路徑分隔符在路徑中指定位置前最後出現的位置,沒有出現時傳回-1。
public static int getPathLsatIndex(String fileName, int fromIndex) {
int point = fileName.lastIndexOf('/', fromIndex);
point = fileName.lastIndexOf('\\', fromIndex);
* 将檔案名中的類型部分去掉。
* @param filename 檔案名
* @return 去掉類型部分的結果
public static String trimType(String filename) {
int index = filename.lastIndexOf(".");
if (index != -1) {
return filename.substring(0, index);
return filename;
* 得到相對路徑。
* 檔案名不是目錄名的子節點時傳回檔案名。
* @param pathName 目錄名
* @return 得到檔案名相對于目錄名的相對路徑,目錄下不存在該檔案時傳回檔案名
public static String getSubpath(String pathName,String fileName) {
int index = fileName.indexOf(pathName);
return fileName.substring(index + pathName.length() + 1);
}
4.遺留問題
目前new FileInputStream()隻會使用絕對路徑,相對沒用過,因為要相對于web伺服器位址,比較麻煩
還不如寫個配置檔案來的快哪
5.按Java檔案類型分類讀取配置檔案
配 置檔案是應用系統中不可缺少的,可以增加程式的靈活性。java.util.Properties是從jdk1.2就有的類,一直到現在都支援load ()方法,jdk1.4以後save(output,string) ->store(output,string)。如果隻是單純的讀,根本不存在煩惱的問題。web層可以通過 Thread.currentThread().getContextClassLoader().
getResourceAsStream("xx.properties") 擷取;Application可以通過new FileInputStream("xx.properties");直接在classes一級擷取。關鍵是有時我們需要通過web修改配置檔案,我們不 能将路徑寫死了。經過測試覺得有以下心得:
1.servlet中讀寫。如果運用Struts 或者Servlet可以直接在初始化參數中配置,調用時根據servletcontext的getRealPath("/")擷取真實路徑,再根據 String file = this.servlet.getInitParameter("abc");擷取相對的WEB-INF的相對路徑。
例:
InputStream input = Thread.currentThread().getContextClassLoader().
getResourceAsStream("abc.properties");
Properties prop = new Properties();
prop.load(input);
input.close();
OutputStream out = new FileOutputStream(path);
prop.setProperty("abc", “test");
prop.store(out, “–test–");
out.close();
2.直接在jsp中操作,通過jsp内置對象擷取可操作的絕對位址。
// jsp頁面
String path = pageContext.getServletContext().getRealPath("/");
String realPath = path+"/WEB-INF/classes/abc.properties";
//java 程式
InputStream in = getClass().getClassLoader().getResourceAsStream("abc.properties"); // abc.properties放在webroot/WEB-INF/classes/目錄下
prop.load(in);
in.close();
OutputStream out = new FileOutputStream(path); // path為通過頁面傳入的路徑
prop.setProperty("abc", “abcccccc");
3.隻通過Java程式操作資源檔案
InputStream in = new FileInputStream("abc.properties"); // 放在classes同級
OutputStream out = new FileOutputStream("abc.properties");