2008年10月11日 星期六

Java文件路徑問題

1.如何獲得當前文件路徑

常用:

字符串類型:System.getProperty("user.dir");

綜合:

public class Test {
public static void main(String[] args) throws Exception {
System.out.println(
Thread.currentThread().getContextClassLoader().getResource(""));

System.out.println(Test.class.getClassLoader().getResource(""));
System.out.println(ClassLoader.getSystemResource(""));
System.out.println(Test.class.getResource(""));
System.out.println(Test.class.getResource("/"));
System.out.println(new File("").getAbsolutePath());
System.out.println(System.getProperty("user.dir"));
}
}

2.Web服務中

(1).Weblogic

WebApplication的系統文件根目錄是你的weblogic安裝所在根目錄。
例如:如果你的weblogic安裝在c:\bea\weblogic700.....
那麼,你的文件根路徑就是c:\.
所以,有兩種方式能夠讓你訪問你的服務器端的文件:
a.使用絕對路徑:
比如將你的參數文件放在c:\yourconfig\yourconf.properties,
直接使用new FileInputStream("yourconfig/yourconf.properties");
b.使用相對路徑:
相對路徑的根目錄就是你的webapplication的根路徑,即WEB-INF的上一級目錄,將你的參數文件放在yourwebapp\yourconfig\yourconf.properties,
這樣使用:
new FileInputStream("./yourconfig/yourconf.properties");
這兩種方式均可,自己選擇。

(2).Tomcat

在類中輸出System.getProperty("user.dir");顯示的是%Tomcat_Home%/bin

(3).Resin

不是你的JSP放的相對路徑,是JSP引擎執行這個JSP編譯成SERVLET
的路徑為根.比如用新建文件法測試File f = new File("a.htm");
這個a.htm在resin的安裝目錄下

(4).如何讀相對路徑哪?

在Java文件中getResource或getResourceAsStream均可

例:getClass().getResourceAsStream(filePath);//filePath可以是"/filename",這裡的/代表web發布根路徑下WEB-INF/classes

(5).獲得文件真實路徑

string file_real_path=request.getRealPath("mypath/filename");

通常使用request.getRealPath("/");

3.文件操作的類

import java.io.*;
import java.net.*;
import java.util.*;
//import javax.swing.filechooser.*;
//import org.jr.swing.filter.*;

/**
*此類中封裝一些常用的文件操作。
*所有方法都是靜態方法,不需要生成此類的實例,
*為避免生成此類的實例,構造方法被申明為private類型的。
* @since 0.1
*/

public class FileUtil {
/**
*私有構造方法,防止類的實例化,因為工具類不需要實例化。
*/
private FileUtil() {

}

/**
*修改文件的最後訪問時間。
*如果文件不存在則創建該文件。
* 目前這個方法的行為方式還不穩定,主要是方法有些信息輸出,這些信息輸出是否保留還在考

慮中。

* @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需要修改最後訪問時間的文件的文件名。
* @since 0.1
*/
public static void touch(String fileName) {
File file = new File(fileName);
touch(file);
}

/**
*修改文件的最後訪問時間。
*如果文件不存在則創建該文件。
* 目前這個方法的行為方式還不穩定,主要是方法有些信息輸出,這些信息輸出是否保留還在考

慮中。

* @param files需要修改最後訪問時間的文件數組。
* @since 0.1
*/
public static void touch(File[] files) {
for (int i = 0; i <>目前這個方法的行為方式還不穩定,主要是方法有些信息輸出,這些信息輸出是否保留還在考

慮中。
* @param fileNames需要修改最後訪問時間的文件名數組。
* @since 0.1
*/
public static void touch(String[] fileNames) {
File[] files = new File[fileNames.length];
for (int i = 0; i < files =" new">注意:可能會在返回false的時候創建部分父目錄。
* @param file要創建的目錄
* @return完全創建成功時返回true,否則返回false。
* @since 0.1
*/
public static boolean makeDirectory(File file) {
File parent = file.getParentFile();
if (parent != null) {
return parent.mkdirs();
}
return false;
}

/**
*創建指定的目錄。
*如果指定的目錄的父目錄不存在則創建其目錄書上所有需要的父目錄。
* 注意:可能會在返回false的時候創建部分父目錄。
* @param fileName要創建的目錄的目錄名
* @return完全創建成功時返回true,否則返回false。
* @since 0.1
*/
public static boolean makeDirectory(String fileName) {
File file = new File(fileName);
return makeDirectory(file);
}

/**
*清空指定目錄中的文件。
*這個方法將盡可能刪除所有的文件,但是只要有一個文件沒有被刪除都會返回false。
*另外這個方法不會迭代刪除,即不會刪除子目錄及其內容。
* @param directory要清空的目錄
* @return目錄下的所有文件都被成功刪除時返回true,否則返回false.
* @since 0.1
*/
public static boolean emptyDirectory(File directory) {
boolean result = false;
File[] entries = directory.listFiles();
for (int i = 0; i < result =" false;" dir =" new" dir ="=" entries =" dir.listFiles();" sz =" entries.length;" i =" 0;" fileurl = "file:/" url =" new" file =" new" file =" new" file =" new" point =" fileName.lastIndexOf('.');" length =" fileName.length();" point ="=" point ="=" point =" getPathLsatIndex(fileName);" length =" fileName.length();" point ="=" point ="=" secondpoint =" getPathLsatIndex(fileName," secondpoint ="=" length ="=" point =" getPathLsatIndex(fileName);" length =" fileName.length();" point ="=" point ="=" secondpoint =" getPathLsatIndex(fileName," secondpoint ="=" point =" fileName.indexOf('/');" point ="=" point =" fileName.indexOf('\\');" point =" fileName.indexOf('/'," point ="=" point =" fileName.indexOf('\\'," point =" fileName.lastIndexOf('/');" point ="=" point =" fileName.lastIndexOf('\\');" point =" fileName.lastIndexOf('/'," point ="=" point =" fileName.lastIndexOf('\\'," index =" filename.lastIndexOf(" index =" fileName.indexOf(pathName);">store(output,string)。如果只是單純的讀,根本不存在煩惱的問題。 web層可以通過Thread.currentThread().getContextClassLoader().
getResourceAsStream("xx.properties")獲取;Application可以通過new FileInputStream("xx.properties");直接在classes一級獲取。關鍵是有時我們需要通過web修改配置文件,我們不能將路徑寫死了。經過測試覺得有以下心得:

1.servlet中讀寫。如果運用Struts或者Servlet可以直接在初始化參數中配置,調用時根據servlet的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");
prop.store(out, “–test–");
out.close();

3.只通過Java程序操作資源文件
InputStream in = new FileInputStream("abc.properties"); //放在classes同級

OutputStream out = new FileOutputStream("abc.properties");關於Java文件路徑問題

沒有留言: