Some pieces of Java

@(Java基础相关)[ClassPath, 文件读取]

Java文件读取问题

当我们遇到读取项目文件的时候,经常遇到的是对文件路径问题的困扰。有很多完善的教程给出了范例,但是我们放到本地却经常报错,那么问题出在哪里?这里来从根源去解释一下:
首先,我们要知道我们编写的代码,是经过编译成类文件(.class)之后再调入JVM中执行的。所以,当我们说一个类的路径的时候,指的不是.java文件的路径,而是.class的路径。

我们有一个这样的示例项目,他的结构为:
这里写图片描述

先看Test类:
这里写图片描述
运行结果为:
这里写图片描述

下面一行一行来看:
注意到this.getClass().getResources("").toString();这里输出的当前类的路径。为:
这里写图片描述

首先看到,类的路径实在/bin目录下的,而不是在.java文件所在的/src目录。
然后还可以看到,因为package del.test这一句把test类打包到del.test包中。所以当前类所在的路径是在根路径的基础上再深入到del/test中

下面一行是:this.getClass().getResource("/").toString();
这里输出的是根目录的路径。为:
这里写图片描述

一定会奇怪为什么根目录在bin呢?在哪里指定了呢?如果你是用的是Eclipse,那么你会发现项目目录下有一个隐藏文件叫做.classpath,打开之,你会发现有这样的两行:

<classpathentry kind="src" path="src/com"/>
<classpathentry kind="output" path="bin"/>

这两行分别指定了kind=”src”,即源代码的根目录,为src/com。所以我们打包的时候会把src/com目录下的所有类进行编译。编译之后的.class文件就放在由kind=”output”指定的bin目录下。同时,会发现不可编译的配置文件.properties也被直接复制到这个目录下。

其实了解这些之后,第三行就很好理解了。读取文件,如果有/起头,则从根目录,即bin目录开始索引。如果没有/起头,则从当前类所在路径开始索引。

THE END

你可能感兴趣的:(Java)