1.如何获得当前文g路径
常用Q?/font>
字符串类型:System.getProperty("user.dir");
l合Q?/font>
package com.zcjl.test.base;
import java.io.File;
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服务?/font>
(1).Weblogic
WebApplication的系l文件根目录是你的weblogic安装所在根目录?br>例如Q如果你的weblogic安装在c:\bea\weblogic700.....
那么Q你的文件根路径是c:\.
所以,有两U方式能够让你访问你的服务器端的文gQ?br>a.使用l对路径Q?br>比如你的参数文件放在c:\yourconfig\yourconf.propertiesQ?br>直接使用 new FileInputStream("yourconfig/yourconf.properties");
b.使用相对路径Q?br>相对路径的根目录是你的webapplication的根路径Q即WEB-INF的上一U目录,你的参数文件放在yourwebapp\yourconfig\yourconf.propertiesQ?br>q样使用Q?br>new FileInputStream("./yourconfig/yourconf.properties");
q两U方式均可,自己选择?/font>
(2).Tomcat
在类中输出System.getProperty("user.dir");昄的是%Tomcat_Home%/bin
(3).Resin
不是你的JSP攄相对路径,是JSP引擎执行q个JSP~译成SERVLET
的\径ؓ?比如用新建文件法试File f = new File("a.htm");
q个a.htm在resin的安装目录下
(4).如何ȝ对\径哪Q?/font>
在Java文g中getResource或getResourceAsStream均可
例:getClass().getResourceAsStream(filePath);//filePath可以?/filename",q里?代表web发布根\径下WEB-INF/classes
(5).获得文g真实路径
string file_real_path=request.getRealPath("mypath/filename");
通常使用request.getRealPath("/");
3.文g操作的类
import java.io.*;
import java.net.*;
import java.util.*;
//import javax.swing.filechooser.*;
//import org.jr.swing.filter.*;
/**
* 此类中封装一些常用的文g操作?br>* 所有方法都是静态方法,不需要生成此cȝ实例Q?br>* 为避免生成此cȝ实例Q构造方法被x为privatecd的?br>* @since 0.1
*/
public class FileUtil {
/**
* U有构造方法,防止cȝ实例化,因ؓ工具cM需要实例化?br> */
private FileUtil() {
}
/**
* 修改文g的最后访问时间?br> * 如果文g不存在则创徏该文件?br> * <b>目前q个Ҏ的行为方式还不稳定,主要是方法有些信息输出,q些信息输出是否保留q在?/font>
虑中?lt;/b>
* @param file 需要修Ҏ后访问时间的文g?br> * @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());
}
}
/**
* 修改文g的最后访问时间?br> * 如果文g不存在则创徏该文件?br> * <b>目前q个Ҏ的行为方式还不稳定,主要是方法有些信息输出,q些信息输出是否保留q在?/font>
虑中?lt;/b>
* @param fileName 需要修Ҏ后访问时间的文g的文件名?br> * @since 0.1
*/
public static void touch(String fileName) {
File file = new File(fileName);
touch(file);
}
/**
* 修改文g的最后访问时间?br> * 如果文g不存在则创徏该文件?br> * <b>目前q个Ҏ的行为方式还不稳定,主要是方法有些信息输出,q些信息输出是否保留q在?/font>
虑中?lt;/b>
* @param files 需要修Ҏ后访问时间的文g数组?br> * @since 0.1
*/
public static void touch(File[] files) {
for (int i = 0; i < files.length; i++) {
touch(files);
}
}
/**
* 修改文g的最后访问时间?br> * 如果文g不存在则创徏该文件?br> * <b>目前q个Ҏ的行为方式还不稳定,主要是方法有些信息输出,q些信息输出是否保留q在?/font>
虑中?lt;/b>
* @param fileNames 需要修Ҏ后访问时间的文g名数l?br> * @since 0.1
*/
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);
}
/**
* 判断指定的文件是否存在?br> * @param fileName 要判断的文g的文件名
* @return 存在时返回trueQ否则返回false?br> * @since 0.1
*/
public static boolean isFileExist(String fileName) {
return new File(fileName).isFile();
}
/**
* 创徏指定的目录?br> * 如果指定的目录的父目录不存在则创建其目录书上所有需要的父目录?br> * <b>注意Q可能会在返回false的时候创建部分父目录?lt;/b>
* @param file 要创建的目录
* @return 完全创徏成功时返回trueQ否则返回false?br> * @since 0.1
*/
public static boolean makeDirectory(File file) {
File parent = file.getParentFile();
if (parent != null) {
return parent.mkdirs();
}
return false;
}
/**
* 创徏指定的目录?br> * 如果指定的目录的父目录不存在则创建其目录书上所有需要的父目录?br> * <b>注意Q可能会在返回false的时候创建部分父目录?lt;/b>
* @param fileName 要创建的目录的目录名
* @return 完全创徏成功时返回trueQ否则返回false?br> * @since 0.1
*/
public static boolean makeDirectory(String fileName) {
File file = new File(fileName);
return makeDirectory(file);
}
/**
* 清空指定目录中的文g?br> * q个Ҏ尽可能删除所有的文gQ但是只要有一个文件没有被删除都会q回false?br> * 另外q个Ҏ不会q代删除Q即不会删除子目录及其内宏V?br> * @param directory 要清I的目录
* @return 目录下的所有文仉被成功删除时q回trueQ否则返回false.
* @since 0.1
*/
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;
}
/**
* 清空指定目录中的文g?br> * q个Ҏ尽可能删除所有的文gQ但是只要有一个文件没有被删除都会q回false?br> * 另外q个Ҏ不会q代删除Q即不会删除子目录及其内宏V?br> * @param directoryName 要清I的目录的目录名
* @return 目录下的所有文仉被成功删除时q回trueQ否则返回false?br> * @since 0.1
*/
public static boolean emptyDirectory(String directoryName) {
File dir = new File(directoryName);
return emptyDirectory(dir);
}
/**
* 删除指定目录及其中的所有内宏V?br> * @param dirName 要删除的目录的目录名
* @return 删除成功时返回trueQ否则返回false?br> * @since 0.1
*/
public static boolean deleteDirectory(String dirName) {
return deleteDirectory(new File(dirName));
}
/**
* 删除指定目录及其中的所有内宏V?br> * @param dir 要删除的目录
* @return 删除成功时返回trueQ否则返回false?br> * @since 0.1
*/
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()) {
return false;
}
}
}
if (!dir.delete()) {
return false;
}
return true;
}
/**
* q回文g的URL地址?br> * @param file 文g
* @return 文g对应的的URL地址
* @throws MalformedURLException
* @since 0.4
* @deprecated 在实现的时候没有注意到FilecLw带一个toURLҎ文件\径{换ؓURL?br> * 请用File.toURLҎ?br> */
public static URL getURL(File file) throws MalformedURLException {
String fileURL = "file:/" + file.getAbsolutePath();
URL url = new URL(fileURL);
return url;
}
/**
* 从文件\径得到文件名?br> * @param filePath 文g的\径,可以是相对\径也可以是绝对\?br> * @return 对应的文件名
* @since 0.4
*/
public static String getFileName(String filePath) {
File file = new File(filePath);
return file.getName();
}
/**
* 从文件名得到文gl对路径?br> * @param fileName 文g?br> * @return 对应的文件\?br> * @since 0.4
*/
public static String getFilePath(String fileName) {
File file = new File(fileName);
return file.getAbsolutePath();
}
/**
* DOS/Windows格式的\径{换ؓUNIX/Linux格式的\径?br> * 其实是\径中?\"全部换ؓ"/"Q因为在某些情况下我们{换ؓq种方式比较方便Q?br> * 某中E度上说"/"?\"更适合作ؓ路径分隔W,而且DOS/Windows也将它当作\径分隔符?br> * @param filePath 转换前的路径
* @return 转换后的路径
* @since 0.4
*/
public static String toUNIXpath(String filePath) {
return filePath.replace('\\', '/');
}
/**
* 从文件名得到UNIX风格的文件绝对\径?br> * @param fileName 文g?br> * @return 对应的UNIX风格的文件\?br> * @since 0.4
* @see #toUNIXpath(String filePath) toUNIXpath
*/
public static String getUNIXfilePath(String fileName) {
File file = new File(fileName);
return toUNIXpath(file.getAbsolutePath());
}
/**
* 得到文g的类型?br> * 实际上就是得到文件名中最后一?#8220;.”后面的部分?br> * @param fileName 文g?br> * @return 文g名中的类型部?br> * @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);
}
}
/**
* 得到文g的类型?br> * 实际上就是得到文件名中最后一?#8220;.”后面的部分?br> * @param file 文g
* @return 文g名中的类型部?br> * @since 0.5
*/
public static String getFileType(File file) {
return getTypePart(file.getName());
}
/**
* 得到文g的名字部分?br> * 实际上就是\径中的最后一个\径分隔符后的部分?br> * @param fileName 文g?br> * @return 文g名中的名字部?br> * @since 0.5
*/
public static String getNamePart(String fileName) {
int point = getPathLsatIndex(fileName);
int length = fileName.length();
if (point == -1) {
return fileName;
}
else if (point == length - 1) {
int secondPoint = getPathLsatIndex(fileName, point - 1);
if (secondPoint == -1) {
if (length == 1) {
return fileName;
}
else {
return fileName.substring(0, point);
}
}
else {
return fileName.substring(secondPoint + 1, point);
}
}
else {
return fileName.substring(point + 1);
}
}
/**
* 得到文g名中的父路径部分?br> * 对两U\径分隔符都有效?br> * 不存在时q回""?br> * 如果文g名是以\径分隔符l尾的则不考虑该分隔符Q例?/path/"q回""?br> * @param fileName 文g?br> * @return 父\径,不存在或者已l是父目录时q回""
* @since 0.5
*/
public static String getPathPart(String fileName) {
int point = getPathLsatIndex(fileName);
int length = fileName.length();
if (point == -1) {
return "";
}
else if (point == length - 1) {
int secondPoint = getPathLsatIndex(fileName, point - 1);
if (secondPoint == -1) {
return "";
}
else {
return fileName.substring(0, secondPoint);
}
}
else {
return fileName.substring(0, point);
}
}
/**
* 得到路径分隔W在文g路径中首ơ出现的位置?br> * 对于DOS或者UNIX风格的分隔符都可以?br> * @param fileName 文g路径
* @return 路径分隔W在路径中首ơ出现的位置Q没有出现时q回-1?br> * @since 0.5
*/
public static int getPathIndex(String fileName) {
int point = fileName.indexOf('/');
if (point == -1) {
point = fileName.indexOf('\\');
}
return point;
}
/**
* 得到路径分隔W在文g路径中指定位|后首次出现的位|?br> * 对于DOS或者UNIX风格的分隔符都可以?br> * @param fileName 文g路径
* @param fromIndex 开始查扄位置
* @return 路径分隔W在路径中指定位|后首次出现的位|,没有出现时返?1?br> * @since 0.5
*/
public static int getPathIndex(String fileName, int fromIndex) {
int point = fileName.indexOf('/', fromIndex);
if (point == -1) {
point = fileName.indexOf('\\', fromIndex);
}
return point;
}
/**
* 得到路径分隔W在文g路径中最后出现的位置?br> * 对于DOS或者UNIX风格的分隔符都可以?br> * @param fileName 文g路径
* @return 路径分隔W在路径中最后出现的位置Q没有出现时q回-1?br> * @since 0.5
*/
public static int getPathLsatIndex(String fileName) {
int point = fileName.lastIndexOf('/');
if (point == -1) {
point = fileName.lastIndexOf('\\');
}
return point;
}
/**
* 得到路径分隔W在文g路径中指定位|前最后出现的位置?br> * 对于DOS或者UNIX风格的分隔符都可以?br> * @param fileName 文g路径
* @param fromIndex 开始查扄位置
* @return 路径分隔W在路径中指定位|前最后出现的位置Q没有出现时q回-1?br> * @since 0.5
*/
public static int getPathLsatIndex(String fileName, int fromIndex) {
int point = fileName.lastIndexOf('/', fromIndex);
if (point == -1) {
point = fileName.lastIndexOf('\\', fromIndex);
}
return point;
}
/**
* 文件名中的cd部分L?br> * @param filename 文g?br> * @return Lcd部分的结?br> * @since 0.5
*/
public static String trimType(String filename) {
int index = filename.lastIndexOf(".");
if (index != -1) {
return filename.substring(0, index);
}
else {
return filename;
}
}
/**
* 得到相对路径?br> * 文g名不是目录名的子节点时返回文件名?br> * @param pathName 目录?br> * @param fileName 文g?br> * @return 得到文g名相对于目录名的相对路径Q目录下不存在该文g时返回文件名
* @since 0.5
*/
public static String getSubpath(String pathName,String fileName) {
int index = fileName.indexOf(pathName);
if (index != -1) {
return fileName.substring(index + pathName.length() + 1);
}
else {
return fileName;
}
}
}
4.遗留问题
目前new FileInputStream()只会使用l对路径Q相Ҏ用过Q因相对于web服务器地址Q比较麻?/font>
q不如写个配|文件来的快?/font>
5.按Java文gcd分类d配置文g
配置文g是应用系l中不可~少的,可以增加E序的灵zL。java.util.Properties是从jdk1.2有的类Q一直到现在都支持load ()ҎQjdk1.4以后save(output,string) ->store(output,string)。如果只是单U的读,Ҏ不存在烦恼的问题。web层可以通过 Thread.currentThread().getContextClassLoader().
getResourceAsStream("xx.properties") 获取QApplication可以通过new FileInputStream("xx.properties");直接在classes一U获取。关键是有时我们需要通过web修改配置文gQ我们不能将路径写死了。经q测试觉得有以下心得Q?/font>
1.servlet中读写。如果运用Struts 或者Servlet可以直接在初始化参数中配|,调用时根据servlet的getRealPath("/")获取真实路径Q再ҎString file = this.servlet.getInitParameter("abc");获取相对的WEB-INF的相对\径?br>例:
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内置对象获取可操作的l对地址?br>例:
// jsp面
String path = pageContext.getServletContext().getRealPath("/");
String realPath = path+"/WEB-INF/classes/abc.properties";
//java E序
InputStream in = getClass().getClassLoader().getResourceAsStream("abc.properties"); // abc.properties攑֜webroot/WEB-INF/classes/目录?br>prop.load(in);
in.close();
OutputStream out = new FileOutputStream(path); // path为通过面传入的\?br>prop.setProperty("abc", “abcccccc");
prop.store(out, “–test–");
out.close();
3.只通过JavaE序操作资源文g
InputStream in = new FileInputStream("abc.properties"); // 攑֜classes同
OutputStream out = new FileOutputStream("abc.properties");

]]>