文件路径异常访问在构建目录中的文件
问题描述:
我创建一个Java类,以检查文件是否存在:文件路径异常访问在构建目录中的文件
package filedemo;
import java.io.File;
public class FileReadDemo {
public static void main(String[] args){
File f = new File("data/"+"hello.xml");
System.out.println("file name="+f.getName());
System.out.println("file path="+f.getPath());
System.out.println("file canon path="+f.getCanonicalPath());
System.out.println("file abs path="+f.getAbsolutePath());
System.out.println("file parent="+f.getParent());
System.out.println("file length="+f.length());
System.out.println("is file="+f.isFile());
System.out.println("file exists:"+f.exists());
}
}
我的应用程序的文件夹结构是:
C:\code\java\javalearn\
|
|--src\filedemo\FileReadDemo.java
|--resources\hello.xml
|--lib
|--build
我创建了一个buildfile如下。
<project name="filereaddemo" >
<property file="local.properties" />
<property name="dir.build" value="build"/>
<property name="dir.classes" value="${dir.build}/classes"/>
<property name="dir.data" value="${dir.classes}/data"/>
<property name="dir.src" value="src"/>
<property name="dir.lib" value="lib"/>
<property name="dir.resources" value="resources"/>
<property name="packagename" value="filedemo"/>
<property name="mainclass" value="FileReadDemo"/>
<path id="clientclasspath">
<pathelement location="${dir.classes}/"/>
<pathelement location="${dir.lib}"/>
</path>
<target name="makedirs">
<mkdir dir="${dir.classes}"/>
<mkdir dir="${dir.data}"/>
</target>
<target name="clean" description="Remove all generated files.">
<delete dir="${dir.build}"/>
</target>
<target name="compile" depends="clean,makedirs" description="Compile all source code">
<copy file="${dir.resources}/hello.xml" todir="${dir.classes}/data">
</copy>
<javac srcdir="${dir.src}" destdir="${dir.classes}" verbose="yes">
<classpath refid="clientclasspath"/>
<include name="**/${mainclass}.java"/>
</javac>
</target>
<target name="run" depends="compile">
<java fork="true" classname="${packagename}.${mainclass}">
<arg value="-verbose"/>
<classpath refid="clientclasspath"/>
</java>
</target>
</project>
执行编译目标时,资源文件夹中的XML文件被复制到build/classes/data文件夹。 所得生成文件夹具有这样的结构:
build---classes---data---hello.xml
|
|---filedemo----FileReadDemo.class
以下是运行目标输出。
run:
[java] file name=hello.xml
[java] file path=data\hello.xml
[java] file canon path=C:\code\java\javalearn\data\hello.xml
[java] file abs path=C:\code\java\javalearn\data\hello.xml
[java] file parent=data
[java] file length=0
[java] is file=false
[java] file exists:false
我预期的绝对路径是
C:\code\java\javalearn\build\classes\data\hello.xml
但是在这里我得到
C:\code\java\javalearn\data\hello.xml
为什么会出现这种情况?我有什么做的就是Java类使用 C到打开的文件对象:\代码\ java的\ javalearn \编译\类\数据\的hello.xml路径?
答
当你执行run目标,你的脚本正在目录运行C:\代码\ java的\ javalearn \
由于该目录是脚本的当前工作目录,和脚本执行的无渣改变目录,它也是java的当前工作目录。
类路径只是告诉java的哪里寻找你的class文件。它不会更改当前的工作目录。因此,当您的项目说“新的文件(数据/的hello.xml)”时,Java在路径“./data/hello.xml”的文件,并翻译了“”在目录路径 “C:\代码\ java的\ javalearn”。 “。”被暗示,任何时候你不开始从根目录的路径。
您也需要执行Java之前更改目录,将你的数据文件夹,或者更改字符串在代码中以指向正确的目录。