JAVA中绝对路径和目录有什么区别

JAVA中绝对路径和目录有什么区别,第1张

按照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等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

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

原文地址:https://54852.com/web/9525418.html

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

发表评论

登录后才能评论

评论列表(0条)

    保存