
按照jdk Doc上的说法”绝对路径名是完整的路径名,不需要任何其他信息就可以定位自身表示的文件。相反,相对路径名必须使用来自其他路径名的信息进行解释。默认情况下,javaio 包中的类总是根据当前用户目录来分析相对路径名。此目录由系统属性 userdir 指定,通常是 Java 虚拟机的调用目录”
相对路径顾名思义,相对于某个路径,那么究竟相对于什么路径我们必须弄明白按照上面jdk文档上讲的这个路径是”当前用户目录”也就是”java虚拟机的调用目录”更明白的说这个路径其实是我们在哪里调用jvm的路径举个例子:
假设有一java源文件Examplejava在d盘根目录下,该文件不含package信息我们进入命令行窗口,然后使用”d:”命令切换到d盘根目录下,然后用”javac Examplejava”来编译此文件,编译无错后,会在d盘根目录下自动生成”Exampleclass”文件我们在调用”java Example”来运行该程序此时我们已经启动了一个jvm,这个jvm是在d盘根目录下被启动的,所以此jvm所加载的程序中File类的相对路径也就是相对这个路径的,即d盘根目录:D:/同时” 当前用户目录”也是D:/在SystemgetProperty(“userdir”);系统变量”userdir”存放的也是这个值
我们可以多做几次试验,把”Exampleclass”移动到不同路径下,同时在那些路径下,执行”java Example”命令启动jvm,我们会发现这个”当前用户目录”是不断变化的,它的路径始终和我们在哪启动jvm的路径是一致的
搞清了这些,我们可以使用相对路径来创建文件,例如:
File file = new File(“atxt”);
FilecreateNewFile();
假设jvm是在”D:/”下启动的,那么atxt就会生成在D:/atxt;
此外,这个参数还可以使用一些常用的路径表示方法,例如””或”/”代表当前目录,这个目录也就是jvm启动路径所以如下代码能得到当前目录完整路径:
File f = new File(“”);
String absolutePath = fgetAbsolutePath();
Systemoutprintln(absolutePath);//D:/
最后要说说在eclipse中的情况:
Eclipse中启动jvm都是在项目根路径上启动的比如有个项目名为blog,其完整路径为:D:/work/IDE/workspace/blog那么这个路径就是jvm的启动路径了所以以上代码如果在eclipse里运行,则输出结果为” D:/work/IDE/workspace/blog”
Tomcat中的情况
如果在tomcat中运行web应用,此时,如果我们在某个类中使用如下代码:
File f = new File(“”);
String absolutePath = fgetAbsolutePath();
Systemoutprintln(absolutePath);
那么输出的将是tomcat下的bin目录我的机器就是” D:/work/server/jakarta-tomcat-5028/bin/”,由此可以看出tomcat服务器是在bin目录下启动jvm的其实是在bin目录下的” catalinabat”文件中启动jvm的
需要2个变量一个是当前路径,另一个是方案栏中的路径。比较字符串,这个你应该会做了吧。第二个变量的减去第一个变量,然后做适当更改就是你要的相对路径了
楼主 如果你的程序在E盘或者D盘 就没有相对路径了。
如果的程序在“c:\documents and settings\administrator\桌面\” 那么相对路径就应当是c:\documents and settings\administrator\桌面\MY\雨的印记wav -c:\documents and settings\administrator\桌面\” =“/MY/雨的印记wav ”
如果的你程序在桌面下的另一文件夹下例如Test文件下 也就是说程序的路径在:c:\documents and settings\administrator\桌面\Test\
相对路径就应当是“/MY/雨的印记wav ”
一点代表当前目录
两点代表上一目录
你应该在项目中(war)开发的时候,就配置一个 configproperties 的文件,专门用来定义这些固定的路径或参数。
然后,你在程序中或页面中使用的时候,直接通过加载这个 configproperties 文件内容到一个 ResourceBundle 中,然后通过 ResourceBundle 读这个内容里面定义的参数名来处理。
如:
ResourceBundle config = (这里加载的方法网上找一下,忘记了);
String path = configgetProperty("real-path");
新建一个maven工程后,main目录下会有java和resources两个文件夹,其中java文件夹下存放源代码,resources文件夹下存放一些配置文件等。
maven%E5%B7%A5%E7%A8%8B%E7%BB%93%E6%9E%84%E5%9B%BEpngJava: maven下读取资源文件的问题, java路径
在弄清楚编译后,资源文件以及字节码存在哪里这个问题之前,有必要明白什么是classpath
classpath实际上就是编译后的 以 classes 文件夹为起点的路径,而在ItelliJ IDEA 中编译后的文件都会存入out/production下。
所以,编译后,resources文件夹中的文件以及java目录下的文件都会存入同一个目录(out/production)下,也就是说,编译后是不存在java和resources这两个目录的。
读取资源文件的若干中方法
package meshenchaomain;
import javaio;
/ Created by jerry on 16-4-20 /
public class Demo1 {
private static void readTxt(String filePath) {
BufferedReader reader = null;
try {
reader = new BufferedReader(new FileReader(filePath));
String line = null;
while ((line = readerreadLine()) != null) {
Systemoutprintln(line);
}
} catch (Exception e) {
eprintStackTrace();
} finally {
if (reader != null) {
try {
readerclose();
} catch (IOException e) {
eprintStackTrace();
}
}
}
}
public static void main(String[] args) {
//获取classpath路径
Systemoutprintln("classpath路径: "+Demo1classgetClassLoader()getResource("")getPath());
//获取当前类的加载路径
Systemoutprintln("当前类加载路径: "+Demo1classgetResource("")getPath());
// 读取文件resources目录中文件的若干种方法
// 方法一:从classpath路径出发读取
readTxt(Demo1classgetClassLoader()getResource("test/demo1txt")getPath());
// 方法二:从类加载路径出发,相当于使用绝对路径
readTxt(Demo1classgetResource("/test/demo1txt")getPath());
// 方法三:从类加载路径出发,相当于使用相对路径
readTxt(Demo1classgetResource("///test/demo1txt")getPath());
}
}
其中demo1txt文件中内容为:
hahahahahahahahahha
输出如下:
classpath路径: /home/jerry/IdeaProjects/Demo/out/production/demo1/
当前类加载路径: /home/jerry/IdeaProjects/Demo/out/production/demo1/me/shenchao/main/
hahahahahahahahahha
hahahahahahahahahha
hahahahahahahahahha
从上面可以发现getResource 与 classgetClassLoader()getResource两者的区别:
前者获取的是当前类加载的路径,如果用此方法读取文件则有两种方法,与相对路径绝对路径非常类似,具体参见代码
后者获取的是类加载器的路径,即会到classpath路径下。可以理解当前在 classp/ 目录下,要想访问哪个文件,直接填写路径即可,不用区分相对路径和绝对路径。显然,此方法比较容易写出。推荐。
cbd5a61765aed016a56103b68dcc8d51gif
相关
Related Posts
JAVA: 理解Java中的类初始化
在运行 Java 代码时,很多时候需要弄清楚程序执行的流程,而面向对象的 Java 程序并非像主要为面向过程而设计的 C 语言一样去顺序执行(简单按照代码的顺序),这使得对于类文件的加载以及执行流程的理解非常重要。本文简单介绍了 Java 类的初始化部分具体过程,包括成员变量、静态代码块、构造函数等的初始化时机及执行流程。 初始化时机 根据 javase 8 的文档说明[1],一个类(本文暂不考虑接口)T…
JAVA: 获取当前月份cget(CalendarMONTH)中月份少一个月
@Test public void testGetTitle(){ Systemoutprintln(new LocalDate()minusDays(1)toString("MM/dd/yyyy")); // joda-time Calendar c1 = CalendargetInstance(); int year…
JAVA: 读写文件的几种方法
如果您使用java8,可以也参考这篇文章:JAVA: Java8流逐行读取文件 import javaioBufferedReader; import javaioBufferedWriter; import javaioFileReader; import javaioFileWriter; import javaioIOException; import javatextSimpleDateFormat;…
绝对路径:从指定分区到目标地点经过的位置,如C:/a/v/c/d/b 这就是绝对路径。
相对路径:相对于当前文件所处位置的路径,如/b 这就是相对路径。
路径名:是路径的名称,包含了该文件的相对或者绝对路径,显示了该文件所处的位置。
文件名:用于标识文件但是和文件属性无关的字符串。
把文件的绝对路径转换成相对路径
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
最常用读取properties文件的方法
InputStream in = getClass()getResourceAsStream("资源Name");这种方式要求properties文件和当前类在同一文件夹下面。如果在不同的包中,必须使用:
InputStream ins = thisgetClass()getResourceAsStream("/cn/zhao/properties/testPropertiesPath2properties");
Java中获取路径方法
获取路径的一个简单实现
反射方式获取properties文件的三种方式
1 反射方式获取properties文件最常用方法以及思考:
Java读取properties文件的方法比较多,网上最多的文章是"Java读取properties文件的六种方法",但在Java应用中,最常用还是通过javalangClass类的getResourceAsStream(String name) 方法来实现,但我见到众多读取properties文件的代码中,都会这么干:
InputStream in = getClass()getResourceAsStream("资源Name");
这里面有个问题,就是getClass()调用的时候默认省略了this!我们都知道,this是不能在static(静态)方法或者static块中使用的,原因是static类型的方法或者代码块是属于类本身的,不属于某个对象,而this本身就代表当前对象,而静态方法或者块调用的时候是不用初始化对象的。
问题是:假如我不想让某个类有对象,那么我会将此类的默认构造方法设为私有,当然也不会写别的共有的构造方法。并且我这个类是工具类,都是静态的方法和变量,我要在静态块或者静态方法中获取properties文件,这个方法就行不通了。
那怎么办呢?其实这个类就不是这么用的,他仅仅是需要获取一个Class对象就可以了,那还不容易啊--
取所有类的父类Object,用Objectclass难道不比你的用你正在写类自身方便安全吗 ?呵呵,下面给出一个例子,以方便交流。
import javautilProperties;
import javaioInputStream;
import javaioIOException;
/
读取Properties文件的例子
File: TestPropertiesjava
User: leizhimin
Date: 2008-2-15 18:38:40
/
public final class TestProperties {
private static String param1;
private static String param2;
static {
Properties prop = new Properties();
InputStream in = Object class getResourceAsStream( "/testproperties" );
try {
propload(in);
param1 = propgetProperty( "initYears1" )trim();
param2 = propgetProperty( "initYears2" )trim();
} catch (IOException e) {
eprintStackTrace();
}
}
/
私有构造方法,不需要创建对象
/
private TestProperties() {
}
public static String getParam1() {
return param1;
}
public static String getParam2() {
return param2;
}
public static void main(String args[]){
Systemoutprintln(getParam1());
Systemoutprintln(getParam2());
}
}
运行结果:
151
152
当然,把Objectclass换成intclass照样行,呵呵,大家可以试试。
另外,如果是static方法或块中读取Properties文件,还有一种最保险的方法,就是这个类的本身名字来直接获取Class对象,比如本例中可写成TestPropertiesclass,这样做是最保险的方法
2 获取路径的方式:
File fileB = new File( this getClass()getResource( "" )getPath());
System out println( "fileB path: " + fileB);
22获取当前类所在的工程名:
System out println("userdir path: " + System getProperty ("userdir"))<span style="background-color: white;">3 获取路径的一个简单的Java实现</span>
/
获取项目的相对路径下文件的绝对路径
@param parentDir
目标文件的父目录,例如说,工程的目录下,有lib与bin和conf目录,那么程序运行于lib or
bin,那么需要的配置文件却是conf里面,则需要找到该配置文件的绝对路径
@param fileName
文件名
@return一个绝对路径
/
public static String getPath(String parentDir, String fileName) {
String path = null;
String userdir = SystemgetProperty("userdir");
String userdirName = new File(userdir)getName();
if (userdirNameequalsIgnoreCase("lib")
|| userdirNameequalsIgnoreCase("bin")) {
File newf = new File(userdir);
File newp = new File(newfgetParent());
if (fileNametrim()equals("")) {
path = newpgetPath() + Fileseparator + parentDir;
} else {
path = newpgetPath() + Fileseparator + parentDir
+ Fileseparator + fileName;
}
} else {
if (fileNametrim()equals("")) {
path = userdir + Fileseparator + parentDir;
} else {
path = userdir + Fileseparator + parentDir + Fileseparator
+ fileName;
}
}
return path;
}
4 利用反射的方式获取路径:
InputStream ips1 = Enumeration class getClassLoader() getResourceAsStream( "cn/zhao/enumStudy/testPropertiesPath1properties" );
InputStream ips2 = Enumeration class getResourceAsStream( "testPropertiesPath1properties" );
InputStream ips3 = Enumeration class getResourceAsStream( "properties/testPropertiesPath2properties" );
以上就是关于JAVA中绝对路径和目录有什么区别全部的内容,包括:JAVA中绝对路径和目录有什么区别、java 绝对路径 转换成相对路径、java web 开发中,获取绝对路径,没有打出war包时可以,打成war包后就成null等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)