java获取路径

java_路径_java获取当前类的绝对路径 简介摘要:另,Class类还有一个getResourceAsStream方法,记得以前有个项目要读取在同一个包内的一个xml,就用的这个。 1.如何获得当前文件路径 常用: (1).Test.class.getResource("") 得到的是当前类FileTest.class文件的URI目录。不包括自己! (2).Test.class.getResource( 另,Class类还有一个getResourceAsStream方法[fang fa],记得以前有个项目[xiang mu]要读取[du qu]在同一个包内的一个xml,就用的这个。 1.如何获得当前文件[wen jian]路径[lu jing] 常用: (1).Test.class.getResource("") 得到的是当前类FileTest.class文件[wen jian]的URI目录。不包括自己! (2).Test.class.getResource("/") 得到的是当前的classpath的绝对URI路径[lu jing]。 (3).Thread.currentThread().getContextClassLoader().getResource("") 得到的也是当前ClassPath的绝对URI路径[lu jing]。 (4).Test.class.getClassLoader().getResource("") 得到的也是当前ClassPath的绝对URI路径[lu jing]。 (5).ClassLoader.getSystemResource("") 得到的也是当前ClassPath的绝对URI路径[lu jing]。 尽量不要使用相对于System.getProperty("user.dir")当前用户[yong hu][dang qian yong hu]目录的相对路径[lu jing],后面可以看出得出结果五花八门。 (6) new File("").getAbsolutePath()也可用。 2.Web服务器[fu wu qi] (1).Tomcat 在类中输出[shu chu]System.getProperty("user.dir");显示[xian shi]的是%Tomcat_Home%/bin (2).Resin 不是你的JSP放的相对路径[lu jing],是JSP引擎[yin qing]执行[zhi hang]这个JSP编译[bian yi]成SERVLET 的路径[lu jing]为根.比如用新建文件[wen jian]法测试File f = new File("a.htm"); 这个a.htm在resin的安装[an zhuang]目录下 (3).如何读文件[wen jian] 使用ServletContext.getResourceAsStream()就可以 (4).获得文件[wen jian]真实路径[lu jing] String file_real_path=ServletContext.getRealPath("mypath/filename"); 不建议使用request.getRealPath("/"); 3.文件[wen jian]操作的类,不建议使用,可以使用commons io类 import java.io.*; import java.net.*; import java.util.*; /** * 此类中封装[feng zhuang]一些常用的文件[wen jian]操作。 * 所有方法[fang fa]都是静态方法[fang fa][jing tai fang fa],不需要生成此类的实例, * 为避免生成此类的实例,构造方法[fang fa][gou zao fang fa]被申明为private类型[lei xing]的。 * @since 0.1 */ public class FileUtil { /** * 私有构造方法[fang fa][gou zao fang fa],防止类的实例化[shi li hua],因为工具类不需要实例化[shi li hua]。 */ private FileUtil() { } /** * 修改[xiu gai]文件[wen jian]的最后访问时间。 * 如果文件[wen jian]不存在则创建该文件[wen jian]。 * 目前这个方法[fang fa]的行为方式还不稳定,主要是方法[fang fa]有些信息[xin xi]输出[shu chu],这些信息[xin xi]输出[shu chu]是否保留还在考 虑中。 * @param file 需要修改[xiu gai]最后访问时间的文件[wen jian]。 * @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()); } } /** * 修改[xiu gai]文件[wen jian]的最后访问时间。 * 如果文件[wen jian]不存在则创建该文件[wen jian]。 * 目前这个方法[fang fa]的行为方式还不稳定,主要是方法[fang fa]有些信息[xin xi]输出[shu chu],这些信息[xin xi]输出[shu chu]是否保留还在考 虑中。 * @param fileName 需要修改[xiu gai]最后访问时间的文件[wen jian]的文件[wen jian]名[wen jian ming]。 * @since 0.1 */ public static void touch(String fileName) { File file = new File(fileName); touch(file); } /** * 修改[xiu gai]文件[wen jian]的最后访问时间。 * 如果文件[wen jian]不存在则创建该文件[wen jian]。 * 目前这个方法[fang fa]的行为方式还不稳定,主要是方法[fang fa]有些信息[xin xi]输出[shu chu],这些信息[xin xi]输出[shu chu]是否保留还在考 虑中。 * @param files 需要修改[xiu gai]最后访问时间的文件[wen jian]数组[shu zu]。 * @since 0.1 */ public static void touch(File[] files) { for (int i = 0; i < files.length; i++) { touch(files); } } /** * 修改[xiu gai]文件[wen jian]的最后访问时间。 * 如果文件[wen jian]不存在则创建该文件[wen jian]。 * 目前这个方法[fang fa]的行为方式还不稳定,主要是方法[fang fa]有些信息[xin xi]输出[shu chu],这些信息[xin xi]输出[shu chu]是否保留还在考 虑中。 * @param fileNames 需要修改[xiu gai]最后访问时间的文件[wen jian]名[wen jian ming]数组[shu zu]。 * @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); } /** * 判断指定的文件[wen jian]是否存在。 * @param fileName 要判断的文件[wen jian]的文件[wen jian]名[wen jian ming] * @return 存在时返回true,否则返回false。 * @since 0.1 */ public static boolean isFileExist(String fileName) { return new File(fileName).isFile(); } /** * 创建指定的目录。 * 如果指定的目录的父目录不存在则创建其目录书上所有需要的父目录。 * 注意:可能会在返回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); } /** * 清空指定目录中的文件[wen jian]。 * 这个方法[fang fa]将尽可能删除[shan chu]所有的文件[wen jian],但是只要有一个文件[wen jian]没有被删除[shan chu]都会返回false。 * 另外这个方法[fang fa]不会迭代[die dai]删除[shan chu],即不会删除[shan chu]子目录及其内容。 * @param directory 要清空的目录 * @return 目录下的所有文件[wen jian]都被成功删除[shan chu]时返回true,否则返回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; } /** * 清空指定目录中的文件[wen jian]。 * 这个方法[fang fa]将尽可能删除[shan chu]所有的文件[wen jian],但是只要有一个文件[wen jian]没有被删除[shan chu]都会返回false。 * 另外这个方法[fang fa]不会迭代[die dai]删除[shan chu],即不会删除[shan chu]子目录及其内容。 * @param directoryName 要清空的目录的目录名 * @return 目录下的所有文件[wen jian]都被成功删除[shan chu]时返回true,否则返回false。 * @since 0.1 */ public static boolean emptyDirectory(String directoryName) { File dir = new File(directoryName); return emptyDirectory(dir); } /** * 删除[shan chu]指定目录及其中的所有内容。 * @param dirName 要删除[shan chu]的目录的目录名 * @return 删除[shan chu]成功时返回true,否则返回false。 * @since 0.1 */ public static boolean deleteDirectory(String dirName) { return deleteDirectory(new File(dirName)); } /** * 删除[shan chu]指定目录及其中的所有内容。 * @param dir 要删除[shan chu]的目录 * @return 删除[shan chu]成功时返回true,否则返回false。 * @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; } /** * 返回文件[wen jian]的URL地址[di zhi]。 * @param file 文件[wen jian] * @return 文件[wen jian]对应的的URL地址[di zhi] * @throws MalformedURLException * @since 0.4 * @deprecated 在实现的时候没有注意到File类本身带一个toURL方法[fang fa]将文件[wen jian]路径[lu jing]转换[zhuan huan]为URL。 * 请使用File.toURL方法[fang fa]。 */ public static URL getURL(File file) throws MalformedURLException { String fileURL = "file:/" + file.getAbsolutePath(); URL url = new URL(fileURL); return url; } /** * 从文件[wen jian]路径[lu jing]得到文件[wen jian]名[wen jian ming]。 * @param filePath 文件[wen jian]的路径[lu jing],可以是相对路径[lu jing]也可以是绝对路径[lu jing] * @return 对应的文件[wen jian]名[wen jian ming] * @since 0.4 */ public static String getFileName(String filePath) { File file = new File(filePath); return file.getName(); } /** * 从文件[wen jian]名[wen jian ming]得到文件[wen jian]绝对路径[lu jing]。 * @param fileName 文件[wen jian]名[wen jian ming] * @return 对应的文件[wen jian]路径[lu jing] * @since 0.4 */ public static String getFilePath(String fileName) { File file = new File(fileName); return file.getAbsolutePath(); } /** * 将DOS/Windows格式的路径[lu jing]转换[zhuan huan]为UNIX/Linux格式的路径[lu jing]。 * 其实就是将路径[lu jing]中的"/"全部换为"/",因为在某些情况[qing kuang]下我们转换[zhuan huan]为这种方式比较方便, * 某中程度上说"/"比"/"更适合作为路径[lu jing]分隔符,而且DOS/Windows也将它当作路径[lu jing]分隔符。 * @param filePath 转换[zhuan huan]前的路径[lu jing] * @return 转换[zhuan huan]后的路径[lu jing] * @since 0.4 */ public static String toUNIXpath(String filePath) { return filePath.replace('//', '/'); } /** * 从文件[wen jian]名[wen jian ming]得到UNIX风格的文件[wen jian]绝对路径[lu jing]。 * @param fileName 文件[wen jian]名[wen jian ming] * @return 对应的UNIX风格的文件[wen jian]路径[lu jing] * @since 0.4 * @see #toUNIXpath(String filePath) toUNIXpath */ public static String getUNIXfilePath(String fileName) { File file = new File(fileName); return toUNIXpath(file.getAbsolutePath()); } /** * 得到文件[wen jian]的类型[lei xing]。 * 实际上就是得到文件[wen jian]名[wen jian ming]中最后一个“.”后面的部分。 * @param fileName 文件[wen jian]名[wen jian ming] * @return 文件[wen jian]名[wen jian ming]中的类型[lei xing]部分 * @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); } } /** * 得到文件[wen jian]的类型[lei xing]。 * 实际上就是得到文件[wen jian]名[wen jian ming]中最后一个“.”后面的部分。 * @param file 文件[wen jian] * @return 文件[wen jian]名[wen jian ming]中的类型[lei xing]部分 * @since 0.5 */ public static String getFileType(File file) { return getTypePart(file.getName()); } /** * 得到文件[wen jian]的名字部分。 * 实际上就是路径[lu jing]中的最后一个路径[lu jing]分隔符后的部分。 * @param fileName 文件[wen jian]名[wen jian ming] * @return 文件[wen jian]名[wen jian ming]中的名字部分 * @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); } } /** * 得到文件[wen jian]名[wen jian ming]中的父路径[lu jing]部分。 * 对两种路径[lu jing]分隔符都有效[you xiao]。 * 不存在时返回""。 * 如果文件[wen jian]名[wen jian ming]是以路径[lu jing]分隔符结尾的则不考虑该分隔符,例如"/path/"返回""。 * @param fileName 文件[wen jian]名[wen jian ming] * @return 父路径[lu jing],不存在或者已经是父目录时返回"" * @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); } } /** * 得到路径[lu jing]分隔符在文件[wen jian]路径[lu jing]中首次出现的位置[wei zhi]。 * 对于DOS或者UNIX风格的分隔符都可以。 * @param fileName 文件[wen jian]路径[lu jing] * @return 路径[lu jing]分隔符在路径[lu jing]中首次出现的位置[wei zhi],没有出现时返回-1。 * @since 0.5 */ public static int getPathIndex(String fileName) { int point = fileName.indexOf('/'); if (point == -1) { point = fileName.indexOf('//'); } return point; } /** * 得到路径[lu jing]分隔符在文件[wen jian]路径[lu jing]中指定位[ding wei]置[wei zhi]后首次出现的位置[wei zhi]。 * 对于DOS或者UNIX风格的分隔符都可以。 * @param fileName 文件[wen jian]路径[lu jing] * @param fromIndex 开始查找[cha zhao]的位置[wei zhi] * @return 路径[lu jing]分隔符在路径[lu jing]中指定位[ding wei]置[wei zhi]后首次出现的位置[wei zhi],没有出现时返回-1。 * @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; } /** * 得到路径[lu jing]分隔符在文件[wen jian]路径[lu jing]中最后出现的位置[wei zhi]。 * 对于DOS或者UNIX风格的分隔符都可以。 * @param fileName 文件[wen jian]路径[lu jing] * @return 路径[lu jing]分隔符在路径[lu jing]中最后出现的位置[wei zhi],没有出现时返回-1。 * @since 0.5 */ public static int getPathLsatIndex(String fileName) { int point = fileName.lastIndexOf('/'); if (point == -1) { point = fileName.lastIndexOf('//'); } return point; } /** * 得到路径[lu jing]分隔符在文件[wen jian]路径[lu jing]中指定位[ding wei]置[wei zhi]前最后出现的位置[wei zhi]。 * 对于DOS或者UNIX风格的分隔符都可以。 * @param fileName 文件[wen jian]路径[lu jing] * @param fromIndex 开始查找[cha zhao]的位置[wei zhi] * @return 路径[lu jing]分隔符在路径[lu jing]中指定位[ding wei]置[wei zhi]前最后出现的位置[wei zhi],没有出现时返回-1。 * @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; } /** * 将文件[wen jian]名[wen jian ming]中的类型[lei xing]部分去掉。 * @param filename 文件[wen jian]名[wen jian ming] * @return 去掉类型[lei xing]部分的结果 * @since 0.5 */ public static String trimType(String filename) { int index = filename.lastIndexOf("."); if (index != -1) { return filename.substring(0, index); } else { return filename; } } /** * 得到相对路径[lu jing]。 * 文件[wen jian]名[wen jian ming]不是目录名的子节点[jie dian]时返回文件[wen jian]名[wen jian ming]。 * @param pathName 目录名 * @param fileName 文件[wen jian]名[wen jian ming] * @return 得到文件[wen jian]名[wen jian ming]相对于目录名的相对路径[lu jing],目录下不存在该文件[wen jian]时返回文件[wen jian]名[wen jian ming] * @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.遗留问题[wen ti] 目前new FileInputStream()只会使用绝对路径[lu jing],相对没用过,因为要相对于web服务器[fu wu qi]地址[di zhi],比较麻烦 还不如写个配置[pei zhi]文件[wen jian][pei zhi wen jian]来的快哪 5.按Java文件[wen jian]类型[lei xing]分类[fen lei]读取[du qu]配置[pei zhi]文件[wen jian][pei zhi wen jian] 配 置文件[wen jian]是应用[ying yong]系统[xi tong]中不可缺少的,可以增加程序的灵活性[ling huo xing]。java.util.Properties是从jdk1.2就有的类,一直到现在都支持[zhi chi]load ()方法[fang fa],jdk1.4以后save(output,string) ->store(output,string)。如果只是单纯的读,根本不存在烦恼的问题[wen ti]。web层可以通过 Thread.currentThread().getContextClassLoader(). getResourceAsStream("xx.properties") 获取;Application可以通过new FileInputStream("xx.properties");直接在classes一级获取。关键是有时我们需要通过web修改[xiu gai]配置[pei zhi]文件[wen jian][pei zhi wen jian],我们不 能将路径[lu jing]写死了。经过测试觉得有以下心得: 1.servlet中读写[du xie]。如果运用Struts 或者Servlet可以直接在初始化[chu shi hua]参数[can shu]中配置[pei zhi],调用[tiao yong]时根据servletcontext的getRealPath("/")获取真实路径[lu jing],再根据 String file = this.servlet.getInitParameter("abc");获取相对的WEB-INF的相对路径[lu jing]。 例: 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内置对象[dui xiang]获取可操作的绝对地址[di zhi][jue dui di zhi]。 例: // 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为通过页面传入的路径[lu jing] prop.setProperty("abc", “abcccccc"); prop.store(out, “–test–"); out.close(); 3.只通过Java程序操作资源[zi yuan]文件[wen jian] InputStream in = new FileInputStream("abc.properties"); // 放在classes同级 OutputStream out = new FileOutputStream("abc.properties");
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值