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("")

得到的也是当前ClassPath的绝对URI路径。

(5).ClassLoader.getSystemResource("")

得到的也是当前ClassPath的绝对URI路径。

尽量不要使用相对于System.getProperty("user.dir")当前用户目录的相对路径,后面可以看出得出结果五花八门。

(6) new File("").getAbsolutePath()也可用。

在jsp和class文件中调用的相对路径不同。在jsp里,根目录是WebRoot 在class文件中,根目录是WebRoot/WEB-INF/classes 当然你也可以用System.getProperty("user.dir")获取你工程的绝对路径。


另:在Jsp,Servlet,Java中详细获得路径的方法!


1.jsp中取得路径:


以工程名为TEST为例:


(1)得到包含工程名的当前页面全路径:request.getRequestURI()

结果:/TEST/test.jsp

(2)得到工程名:request.getContextPath()

结果:/TEST

(3)得到当前页面所在目录下全名称:request.getServletPath()

结果:如果页面在jsp目录下 /TEST/jsp/test.jsp

(4)得到页面所在服务器的全路径:application.getRealPath("页面.jsp")

结果:D:\resin\webapps\TEST\test.jsp

(5)得到页面所在服务器的绝对路径:absPath=new java.io.File(application.getRealPath(request.getRequestURI())).getParent();

结果:D:\resin\webapps\TEST


2.在类中取得路径:


(1)类的绝对路径:Class.class.getClass().getResource("/").getPath()

结果:/D:/TEST/WebRoot/WEB-INF/classes/pack/

(2)得到工程的路径:System.getProperty("user.dir")

结果:D:\TEST


3.在Servlet中取得路径:


(1)得到工程目录:request.getSession().getServletContext().getRealPath("") 参数可具体到包名。

结果:E:\Tomcat\webapps\TEST

(2)得到IE地址栏地址:request.getRequestURL()

结果:http://localhost:8080/TEST/test

(3)得到相对地址:request.getRequestURI()

结果:/TEST/test


2011-01-04 11:40

另,Class类还有一个getResourceAsStream方法,记得以前有个项目要读取在同一个包内的一个xml,就用的这个。

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("")

得到的也是当前ClassPath的绝对URI路径。

(5).ClassLoader.getSystemResource("")

得到的也是当前ClassPath的绝对URI路径。

尽量不要使用相对于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  
/
public class FileUtil {
  //

  
 私有构造方法,防止类的实例化,因为工具类不需要实例化。

  
  private FileUtil()
{

  }

  //

  
 修改文件的最后访问时间。

  
 如果文件不存在则创建该文件。

  
 ≤b≥目前这个方法的行为方式还不稳定,主要是方法有些信息输出,这些信息输出是否保留还在考

虑中。≤/b≥
    @param
file 需要修改最后访问时间的文件。

    @since
 
  
  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())
{

    
   //  
    
   }

    
   else {

    
   //  
    
   }

    
 }

    
 catch (IOException e) {

    
 //  
    
   e.printStackTrace();

    
 }

  
 }

  
 boolean result =
file.setLastModified(currentTime);

    if
(!result) {

    //
 
  
 }

  }

  //

  
 修改文件的最后访问时间。

  
 如果文件不存在则创建该文件。

  
 ≤b≥目前这个方法的行为方式还不稳定,主要是方法有些信息输出,这些信息输出是否保留还在考

虑中。≤/b≥
    @param
fileName 需要修改最后访问时间的文件的文件名。

    @since
 
  
  public static void
touch(String fileName) {

    File
file = new File(fileName);

  
 touch(file);

  }

  //

  
 修改文件的最后访问时间。

  
 如果文件不存在则创建该文件。

  
 ≤b≥目前这个方法的行为方式还不稳定,主要是方法有些信息输出,这些信息输出是否保留还在考

虑中。≤/b≥
    @param
files 需要修改最后访问时间的文件数组。

    @since
 
  
  public static void
touch(File[] files) {

    for
(int i = 0; i ≤ files.length; i++) {

    
 touch(files);

  
 }

  }

  //

  
 修改文件的最后访问时间。

  
 如果文件不存在则创建该文件。

  
 ≤b≥目前这个方法的行为方式还不稳定,主要是方法有些信息输出,这些信息输出是否保留还在考

虑中。≤/b≥
    @param
fileNames 需要修改最后访问时间的文件名数组。

    @since
 
  
  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。

    @since
 
  
  public static boolean
isFileExist(String fileName) {

    return
new File(fileName).isFile();

  }

  //

  
 创建指定的目录。

  
 如果指定的目录的父目录不存在则创建其目录书上所有需要的父目录。

  
 ≤b≥注意:可能会在返回false的时候创建部分父目录。≤/b≥

    @param
file 要创建的目录

  
 @return 完全创建成功时返回true,否则返回false。

    @since
 
  
  public static boolean
makeDirectory(File file) {

    File
parent = file.getParentFile();

    if
(parent != null) {

    
 return parent.mkdirs();

  
 }

    return
false;

  }

  //

  
 创建指定的目录。

  
 如果指定的目录的父目录不存在则创建其目录书上所有需要的父目录。

  
 ≤b≥注意:可能会在返回false的时候创建部分父目录。≤/b≥

    @param
fileName 要创建的目录的目录名

  
 @return 完全创建成功时返回true,否则返回false。

    @since
 
  
  public static boolean
makeDirectory(String fileName) {

    File
file = new File(fileName);

    return
makeDirectory(file);

  }

  //

  
 清空指定目录中的文件。

  
 这个方法将尽可能删除所有的文件,但是只要有一个文件没有被删除都会返回false。

  
 另外这个方法不会迭代删除,即不会删除子目录及其内容。

    @param
directory 要清空的目录

  
 @return 目录下的所有文件都被成功删除时返回true,否则返回false.

    @since
 
  
  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;

  }

  //

  
 清空指定目录中的文件。

  
 这个方法将尽可能删除所有的文件,但是只要有一个文件没有被删除都会返回false。

  
 另外这个方法不会迭代删除,即不会删除子目录及其内容。

    @param
directoryName 要清空的目录的目录名

  
 @return 目录下的所有文件都被成功删除时返回true,否则返回false。

    @since
 
  
  public static boolean
emptyDirectory(String directoryName) {

    File
dir = new File(directoryName);

    return
emptyDirectory(dir);

  }

  //

  
 删除指定目录及其中的所有内容。

    @param
dirName 要删除的目录的目录名

  
 @return 删除成功时返回true,否则返回false。

    @since
 
  
  public static boolean
deleteDirectory(String dirName) {

    return
deleteDirectory(new File(dirName));

  }

  //

  
 删除指定目录及其中的所有内容。

    @param
dir 要删除的目录

  
 @return 删除成功时返回true,否则返回false。

    @since
 
  
  public static boolean
deleteDirectory(File dir) {

    if (
(dir == null) || !dir.isDirectory()) {

    
 throw new IllegalArgumentException("Argument " +
dir +

    
     
     
     
     
     
     
  
 }

    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;

  }


  //

  
 返回文件的URL地址。

    @param
file 文件

  
 @return 文件对应的的URL地址

  
 @throws MalformedURLException

    @since
 
  
 @deprecated
在实现的时候没有注意到File类本身带一个toURL方法将文件路径转换为URL。

    
     
     
  
  public static URL
getURL(File file) throws MalformedURLException {

    String
fileURL = "file:/" + file.getAbsolutePath();

    URL
url = new URL(fileURL);

    return
url;

  }

  //

  
 从文件路径得到文件名。

    @param
filePath 文件的路径,可以是相对路径也可以是绝对路径

  
 @return 对应的文件名

    @since
 
  
  public static String
getFileName(String filePath) {

    File
file = new File(filePath);

    return
file.getName();

  }

  //

  
 从文件名得到文件绝对路径。

    @param
fileName 文件名

  
 @return 对应的文件路径

    @since
 
  
  public static String
getFilePath(String fileName) {

    File
file = new File(fileName);

    return
file.getAbsolutePath();

  }

  //

  
 将DOS/Windows格式的路径转换为UNIX/Linux格式的路径。

  
 其实就是将路径中的""全部换为"/",因为在某些情况下我们转换为这种方式比较方便,

  
 某中程度上说"/"比""更适合作为路径分隔符,而且DOS/Windows也将它当作路径分隔符。

    @param
filePath 转换前的路径

  
 @return 转换后的路径

    @since
 
  
  public static String
toUNIXpath(String filePath) {

    return
filePath.replace('\\', '/');

  }

  //

  
 从文件名得到UNIX风格的文件绝对路径。

    @param
fileName 文件名

  
 @return 对应的UNIX风格的文件路径

    @since
 
    @see
#toUNIXpath(String filePath) toUNIXpath

  
  public static String
getUNIXfilePath(String fileName) {

    File
file = new File(fileName);

    return
toUNIXpath(file.getAbsolutePath());

  }

  //

  
 得到文件的类型。

  
 实际上就是得到文件名中最后一个“.”后面的部分。

    @param
fileName 文件名

  
 @return 文件名中的类型部分

    @since
 
  
  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);

  
 }

  }

  //

  
 得到文件的类型。

  
 实际上就是得到文件名中最后一个“.”后面的部分。

    @param
file 文件

  
 @return 文件名中的类型部分

    @since
 
  
  public static String
getFileType(File file) {

    return
getTypePart(file.getName());

  }

  //

  
 得到文件的名字部分。

  
 实际上就是路径中的最后一个路径分隔符后的部分。

    @param
fileName 文件名

  
 @return 文件名中的名字部分

    @since
 
  
  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);

  
 }

  }

  //

  
 得到文件名中的父路径部分。

  
 对两种路径分隔符都有效。

  
 不存在时返回""。

  
 如果文件名是以路径分隔符结尾的则不考虑该分隔符,例如"/path/"返回""。

    @param
fileName 文件名

  
 @return 父路径,不存在或者已经是父目录时返回""

    @since
 
  
  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);

  
 }

  }

  //

  
 得到路径分隔符在文件路径中首次出现的位置。

  
 对于DOS或者UNIX风格的分隔符都可以。

    @param
fileName 文件路径

  
 @return 路径分隔符在路径中首次出现的位置,没有出现时返回-1。

    @since
 
  
  public static int
getPathIndex(String fileName) {

    int
point = fileName.indexOf('/');

    if
(point == -1) {

    
 point = fileName.indexOf('\\');

  
 }

    return
point;

  }

  //

  
 得到路径分隔符在文件路径中指定位置后首次出现的位置。

  
 对于DOS或者UNIX风格的分隔符都可以。

    @param
fileName 文件路径

    @param
fromIndex 开始查找的位置

  
 @return 路径分隔符在路径中指定位置后首次出现的位置,没有出现时返回-1。

    @since
 
  
  public static int
getPathIndex(String fileName, int fromIndex) {

    int
point = fileName.indexOf('/', fromIndex);

    if
(point == -1) {

    
 point = fileName.indexOf('\\', fromIndex);

  
 }

    return
point;

  }

  //

  
 得到路径分隔符在文件路径中最后出现的位置。

  
 对于DOS或者UNIX风格的分隔符都可以。

    @param
fileName 文件路径

  
 @return 路径分隔符在路径中最后出现的位置,没有出现时返回-1。

    @since
 
  
  public static int
getPathLsatIndex(String fileName) {

    int
point = fileName.lastIndexOf('/');

    if
(point == -1) {

    
 point = fileName.lastIndexOf('\\');

  
 }

    return
point;

  }

  //

  
 得到路径分隔符在文件路径中指定位置前最后出现的位置。

  
 对于DOS或者UNIX风格的分隔符都可以。

    @param
fileName 文件路径

    @param
fromIndex 开始查找的位置

  
 @return 路径分隔符在路径中指定位置前最后出现的位置,没有出现时返回-1。

    @since
 
  
  public static int
getPathLsatIndex(String fileName, int fromIndex) {

    int
point = fileName.lastIndexOf('/', fromIndex);

    if
(point == -1) {

    
 point = fileName.lastIndexOf('\\',
fromIndex);

  
 }

    return
point;

  }

  //

  
 将文件名中的类型部分去掉。

    @param
filename 文件名

  
 @return 去掉类型部分的结果

    @since
 
  
  public static String
trimType(String filename) {

    int
index = filename.lastIndexOf(".");

    if
(index != -1) {

    
 return filename.substring(0, index);

  
 }

    else
{

    
 return filename;

  
 }

  }

  //

  
 得到相对路径。

  
 文件名不是目录名的子节点时返回文件名。

    @param
pathName 目录名

    @param
fileName 文件名

  
 @return 得到文件名相对于目录名的相对路径,目录下不存在该文件时返回文件名

    @since
 
  
  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()只会使用绝对路径,相对没用过,因为要相对于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");
prop.store(out, “–test–");
out.close();
3.只通过Java程序操作资源文件
InputStream in = new FileInputStream("abc.properties"); //
放在classes同级
OutputStream out = new
FileOutputStream("abc.properties");