maven项目只能读到绝对路径下的文件,读不到相对路径下的文件

maven项目只能读到绝对路径下的文件,读不到相对路径下的文件,第1张

新建一个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;…

InputStream is = thisgetClass()getResourceAsStream("/文件相对路径");

getResourceAsStreampublic InputStreamgetResourceAsStream(String name)查找具有给定名称的资源。查找与给定类相关的资源的规则是通过定义类的 class loader

实现的。此方法委托此对象的类加载器。如果此对象通过引导类加载器加载,则此方法将委托给 ClassLoadergetSystemResourceAsStream(javalangString)。

在委托前,使用下面的算法从给定的资源名构造一个绝对资源名:

如果 name 以 '/' 开始 ('\u002f'),则绝对资源名是 '/'

后面的 name 的一部分。

否则,绝对名具有以下形式:

modified_package_name/name其中 modified_package_name 是此对象的包名,该名用 '/' 取代了 ''

('\u002e')。 

有问题再追问,good luck!

string str = @"c:\abc\def\ghi"; int idx = strTrimEnd('\\')LastIndexOf('\\'); if(idx>0){ string updir = strSubstring(0,idx);// updir就是上一级物理路径了 }else{ // 已经是根目录,没上一级了 }

用Jsp获取、用Java类获取或用servlet获取项目绝对路径。

一、用Jsp获取

1、获取文件的绝对路径

String file="文件";(例如:datamdb)

String path=applicationgetRealPath(file);

2、获取文件的绝对路径

String p2=requestgetRequestURI();

3、获取当前jsp页面的路径

String p3=requestgetContextPath();

4、获取当前项目的路径

String p4=requestgetServletPath(); 

二、用Java类获取

1、获取Eclipse路径

String a1=SystemgetProperty("userdir");

2、获取当前的classpath路径

String a2=类名classgetResource("")toString();

String a3=DBConnectionclassgetResource("/")toString();

String a4=DBConnectionclassgetClassLoader()getResource("")toString();

String t=ThreadcurrentThread()getContextClassLoader()getResource("")getPath();

3、获取文件的绝对路径

如果要获取WebContent目录下的文件绝对路径怎么办?可以用下面的方法

String t=ThreadcurrentThread()getContextClassLoader()getResource("")getPath();

int num=tindexOf("metadata");

String path=tsubstring(1,num)replace('/', '\\')+"项目名\\WebContent\\文件";

三、用servlet获取

1、获取项目的绝对路径

requestgetSession()getServletContext()getRealPath("")

2、获取浏览器地址

requestgetRequestURL()

3、获取当前文件的绝对路径

requestgetSession()getServletContext()getRealPath(requestgetRequestURI())

获取当前线程的ClassLoader,通过ClassLoader获取当前工作目录,对目录下的文件进行遍历扫描。过滤出以class为后缀的类文件,并加载类到list中,对list中所有类进行校验,判断是否为指定接口的实现类,并排除自身。返回所有符合条件的类。

这个方没有考虑不同的文件格式。当程序打成jar包,发布运行时,上述的这种遍历file的 *** 作就失效了。只能扫描到当前方法的同级目录及其子目录。无法覆盖整个模块,遍历文件的逻辑太啰嗦,可以简化。

扩展资料:

Java使用注意事项:

1、如果没有定义环境变量classpath,java启动jvm后,会在当前目录下查找要运行的类文件。

2、如果指定了classpath,那么会在指定的目录下查找要运行的类文件。

3、PATH环境变量。作用是指定命令搜索路径,在命令行下面执行命令如javac编译java程序时,它会到PATH变量所指定的路径中查找看是否能找到相应的命令程序。

4、需要把jdk安装目录下的bin目录增加到现有的PATH变量中,bin目录中包含经常要用到的可执行文件如javac/java/javadoc等待,设置好PATH变量后,就可以在任何目录下执行javac/java等工具了。

1、利用SystemgetProperty()函数获取当前路径:

Systemoutprintln(SystemgetProperty("userdir"));//userdir指定了当前的路径

2、使用File提供的函数获取当前路径:

File directory = new File("");//设定为当前文件夹

try{

Systemoutprintln(directorygetCanonicalPath());//获取标准的路径

Systemoutprintln(directorygetAbsolutePath());//获取绝对路径

}catch(Exceptin e){}

FilegetCanonicalPath()和FilegetAbsolutePath()大约只是对于new File("")和new

File("")两种路径有所区别。

# 对于getCanonicalPath()函数,“"就表示当前的文件夹,而”“则表示当前文件夹的上一级文件夹

# 对于getAbsolutePath()函数,则不管””、“”,返回当前的路径加上你在new File()时设定的路径

# 至于getPath()函数,得到的只是你在new File()时设定的路径

Java基础知识教程:

读取配置文件 , xxxproperties放在webroot/WEB-INF/classes/目录下

首先将配置文件转换成InputStream,有两种方式,原理一样,都是通过类加载器得到资源:

(1)InputStream inputStream = ThreadcurrentThread()getContextClassLoader()getResourceAsStream("xxproperties");

(2) InputStream inputStream =

thisgetClass() getClassLoader()getResourceAsStream( "xxproperties" );

调用对象的getClass()方法是获得对象当前的类类型,这部分数据存在方法区中,

而后在类类型上调用 getClassLoader()方法是得到当前类型的类加载器,我们知道在Java中所有的类都是通过加载器加载到虚拟机中的,而且类加载器之间存在父 子关系,就是子知道父,父不知道子,这样不同的子加载的类型之间是无法访问的(虽然它们都被放在方法区中),所以在这里通过当前类的加载器来加载资源也就 是保证是和类类型同一个加载器加载的。

最后调用了类加载器的getResourceAsStream()方法来加载资源。

(3) 然后加载配置文件,读取属性值

Properties prop = new Properties();

propload(input);

String value = propgetProperty("PropertyName");

inputclose();

1、用Systemgetenv();获取当前系统环境的变量名,如下:

publicclass Test {

publicstaticvoid main(String[] args) {

Map<String, String> map = Systemgetenv();

for(Iterator<String> itr = mapketSet()iterator();itrhasNext();){

String key = itrnext();

Systemoutprintln(key + "=" + mapget(key));

}

}

}

系统环境变量名如下:

01USERPROFILE :用户目录

02USERDNSDOMAIN :用户域

03PATHEXT :可执行后缀

04JAVA_HOME :Java安装目录

05TEMP :用户临时文件目录

06SystemDrive :系统盘符

07ProgramFiles :默认程序目录

08USERDOMAIN :帐户的域的名称

09ALLUSERSPROFILE :用户公共目录

10SESSIONNAME :Session名称

11TMP :临时目录

12Path :path环境变量

13CLASSPATH :classpath环境变量

14PROCESSOR_ARCHITECTURE :处理器体系结构

15OS : *** 作系统类型

16PROCESSOR_LEVEL :处理级别

17COMPUTERNAME :计算机名

18Windir :系统安装目录

19SystemRoot :系统启动目录

20USERNAME :用户名

21ComSpec :命令行解释器可执行程序的准确路径

22APPDATA :应用程序数据目录

2、用SystemgetProperties(); 获取当前的系统属性,如下:

publicclass Test {

publicstaticvoid main(String[] args) {

Properties props = SystemgetProperties();

propslist(Systemout);

}

}

系统属性名如下:

01javaversion Java :运行时环境版本

02javavendor Java :运行时环境供应商

03javavendorurl :Java供应商的 URL

04javahome :Java安装目录

05javavmspecificationversion: Java虚拟机规范版本

06javavmspecificationvendor :Java虚拟机规范供应商

07javavmspecificationname :Java虚拟机规范名称

08javavmversion :Java虚拟机实现版本

09javavmvendor :Java虚拟机实现供应商

10javavmname :Java虚拟机实现名称

11javaspecificationversion :Java运行时环境规范版本

12javaspecificationvendor :Java运行时环境规范供应商

13javaspecificationname :Java运行时环境规范名称

14javaclassversion :Java类格式版本号

15javaclasspath :Java类路径

16javalibrarypath :加载库时搜索的路径列表

17javaiotmpdir :默认的临时文件路径

18javacompiler :要使用的 JIT编译器的名称

19javaextdirs :一个或多个扩展目录的路径

20osname : *** 作系统的名称

21osarch : *** 作系统的架构

22osversion : *** 作系统的版本

23fileseparator :文件分隔符

24pathseparator :路径分隔符

25lineseparator :行分隔符

26username :用户的账户名称

27userhome :用户的主目录

28userdir :用户的当前工作目录

以上就是关于maven项目只能读到绝对路径下的文件,读不到相对路径下的文件全部的内容,包括:maven项目只能读到绝对路径下的文件,读不到相对路径下的文件、java如何获取classpath中某文件的输出流、怎样获得当前类路径的上一级路径等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

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

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

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

发表评论

登录后才能评论

评论列表(0条)

    保存