java里绝对路径和相对路径的区别是什么?

java里绝对路径和相对路径的区别是什么?,第1张

按照jdk Doc上的说法”绝对路径名是完整的路径名,不需要任何其他信息就可以定位自身表示的文件。相反,相对路径名必须使用来自其他路径名的信息进行解释。默认情况下,javaio 包中的类总是根据当前用户目录来分析相对路径名。此目录由系统属性 userdir 指定,通常是 Java 虚拟机的调用目录”\x0d\ \x0d\相对路径顾名思义,相对于某个路径,那么究竟相对于什么路径我们必须弄明白按照上面jdk文档上讲的这个路径是”当前用户目录”也就是”java虚拟机的调用目录”更明白的说这个路径其实是我们在哪里调用jvm的路径举个例子:\x0d\ \x0d\假设有一java源文件Examplejava在d盘根目录下,该文件不含package信息我们进入命令行窗口,然后使用”d:”命令切换到d盘根目录下,然后用”javac Examplejava”来编译此文件,编译无错后,会在d盘根目录下自动生成”Exampleclass”文件我们在调用”java Example”来运行该程序此时我们已经启动了一个jvm,这个jvm是在d盘根目录下被启动的,所以此jvm所加载的程序中File类的相对路径也就是相对这个路径的,即d盘根目录:D:/同时” 当前用户目录”也是D:/在SystemgetProperty(“userdir”);系统变量”userdir”存放的也是这个值\x0d\我们可以多做几次试验,把”Exampleclass”移动到不同路径下,同时在那些路径下,执行”java Example”命令启动jvm,我们会发现这个”当前用户目录”是不断变化的,它的路径始终和我们在哪启动jvm的路径是一致的\x0d\搞清了这些,我们可以使用相对路径来创建文件,例如:\x0d\File file = new File(“atxt”);\x0d\FilecreateNewFile();\x0d\假设jvm是在”D:/”下启动的,那么atxt就会生成在D:/atxt;\x0d\此外,这个参数还可以使用一些常用的路径表示方法,例如””或”/”代表当前目录,这个目录也就是jvm启动路径所以如下代码能得到当前目录完整路径:\x0d\File f = new File(“”);\x0d\String absolutePath = fgetAbsolutePath();\x0d\Systemoutprintln(absolutePath);//D:/\x0d\最后要说说在eclipse中的情况:\x0d\Eclipse中启动jvm都是在项目根路径上启动的比如有个项目名为blog,其完整路径为:D:/work/IDE/workspace/blog那么这个路径就是jvm的启动路径了所以以上代码如果在eclipse里运行,则输出结果为” D:/work/IDE/workspace/blog”\x0d\ \x0d\Tomcat中的情况\x0d\如果在tomcat中运行web应用,此时,如果我们在某个类中使用如下代码:\x0d\File f = new File(“”);\x0d\String absolutePath = fgetAbsolutePath();\x0d\Systemoutprintln(absolutePath);\x0d\那么输出的将是tomcat下的bin目录我的机器就是” D:/work/server/jakarta-tomcat-5028/bin/”,由此可以看出tomcat服务器是在bin目录下启动jvm的其实是在bin目录下的” catalinabat”文件中启动jvm的

javaioFile提供了两个方法:
File
getAbsoluteFile()返回一个File对象实例
Returns the absolute form of this abstract pathname
String
getAbsolutePath() 返回一个字符串
Returns the absolute pathname string of this abstract pathname
javaniofilePath提供的
Path
toAbsolutePath()
Returns a Path object representing the absolute path of this
path

1 使用javalangClass类的getResourceAsStream(String name)方法InputStream in = getClass()getResourceAsStream("/configproperties");

在静态方法中,由于不能使用getClass()方法,必须写出类的名字。区别不大。

MyClassclassgetResourceAsStream("/configproperties");

使用这个方法,路径前面可以加斜杠也可以不加。根据Class类getResourceAsStream()方法的JavaDoc:

Finds a resource with a given name  The rules for searching resources associated with a given class are implemented by the defining  class loader of the class  This method delegates to this object's class loader  If this object was loaded by the bootstrap class loader, the method delegates to ClassLoadergetSystemResourceAsStream

Before delegation, an absolute resource name is constructed from the given resource name using this algorithm:

If the name begins with a '/' ('\u002f'), then the absolute name of the resource is the portion of the name following the '/'

Otherwise, the absolute name is of the following form:

modified_package_name/name

Where the modified_package_name is the package name of this object with '/' substituted for '' ('\u002e')

就是说,这个path假如以斜杠开头,则斜杠后面的部分是文件相对classpath的路径;假如不是,Java会把这个path看作是“包名/文件名”的结构,会尝试在这个类的包里面去找,而不是从classpath开始找;在这种情况下,除非你把properties文件放到MyClassclass所属的包里面,不然都会是null的。

2 使用javalangClassLoader类的getResourceAsStream(String name)方法路径是不能加斜杠的!非常重要。
MyClassclassgetClassLoader()getResourceAsStream("configproperties");

这是因为使用classloader进行读取,所输入的参数必须是一个相对classpath的绝对路径,在格式上,一个绝对路径是不能以'/'开头的。

注意这两个方法是同名的,但路径参数的格式截然不同。

3 在Maven中的运用

现在几乎所有的web project都是maven project,Maven的默认设置是把

src/main/resources/

加入到classpath里面的。那么,最好的做法是把你的properties文件放进src/main/resources里面,然后用上面代码读取。用Class类的,一般要加斜杠;用ClassLoader类的,绝不能加斜杠!

假如是Eclipse里面,需要把这个src/main/resources加到classpath里面。具体 *** 作是右击工程,选择“Configure buildpath”,根据Maven的要求,把src/main/java和src/main/resources都加进去,并且保证Exclude是none,Include是all,或者至少要包括你需要读取的文件。

首先明确一下目的:把盛有HTML代码的content字符串中的img标签的src属性中的字符串提取出来并进行修改到绝对路径

首先要利用到正则,我先提供一个方法是对属性提取并返回一个String数组

private final static Pattern ATTR_PATTERN = Patterncompile("<img[^<>]\\ssrc=['\"]()['\"]\\s>",PatternCASE_INSENSITIVE);
private String[] getRelativePaths(String source) {
Matcher matcher = ATTR_PATTERNmatcher(source);
List<String> result = new ArrayList<String>();
while (matcherfind()) {
resultadd(matchergroup(1));
}
return (String[]) resulttoArray();
}

然后呢需要进行拼接

String result = getRelativePaths(content);
for (String path : result) {
    path = bigpath + pathsubString(1);
}

打开文件时要获取文件绝对路径的方法是:FilegetAbsolutePath()获取文件的绝对路径;
Java可以 *** 作OS的进程。在Javalang包中Process的子类具有相关的功能。Process 类提供了执行从进程输入、执行输出到进程、等待进程完成、检查进程的退出状态以及销毁(杀掉)进程的方法。

如果是多个文件的话,可以通过遍历某个文件夹查找指定文件的,之后分别记录文件名称和对应的绝对路径:
import javaioFile;
import javautilHashMap;
public class Test1 {
static HashMap<String, String> filelist=new HashMap<String, String>();
/
递归方法
@param path 文件路径
/
public static void find(String path){
File file=new File(path);
File[] files = filelistFiles();
//如果文件数组为null则返回
if (files == null)
return;
for (int i = 0; i < fileslength; i++) {
if (files[i]isDirectory()) {
//判断是不是文件夹,如果是文件夹则继续向下查找文件
find(files[i]getAbsolutePath());
} else {
//记录文件路径
String filePath = files[i]getAbsolutePath()toLowerCase();
//记录文件名
String fileName=files[i]getName()toLowerCase();
// Systemoutprintln("---"+strFileName);
filelistput(fileName, filePath);
}
}
}
public static void main(String[] args) {
//需要遍历的路径,也就是你要查找文件所在的路径
String path="D:\\kpi\\";
find(path);
Systemoutprintln("kpi9的路径:"+filelistget("kpi9"));
//输出结果:d:\kpi\kpi9
}
}

1、资源文件放在服务器下是完全没问题的,一个网站发布后也不会随便更新的。
2、如果资源文件过多、或都过大,是建议放到服务器下的,会占用服务器过大的空间,你可以在tomcat中再配置一个虚拟路径,指向一个盘符下一个文件夹(如:d:/images),在
tomcat

serverxml
中设置,然后你就可以用你的服务器地址+/img/+资源路径(注意:这个资源路径是相对d:/images的相对路径)去访问资源了
具体设置方法:
在conf目录下的serverxml文件里的里面加入
例如:
<
context
path=”test”
docbase=”f:\webroot\”/>


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/13394266.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-07-27
下一篇 2023-07-27

发表评论

登录后才能评论

评论列表(0条)

保存