2011-05-18 54 views
0

我创建一个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路径?

回答

0

当你执行run目标,你的脚本正在目录运行C:\代码\ java的\ javalearn \

由于该目录是脚本的当前工作目录,和脚本执行的无渣改变目录,它也是java的当前工作目录。

类路径只是告诉java的哪里寻找你的class文件。它不会更改当前的工作目录。因此,当您的项目说“新的文件(数据/的hello.xml)”时,Java在路径“./data/hello.xml”的文件,并翻译了“”在目录路径 “C:\代码\ java的\ javalearn”。 “。”被暗示,任何时候你不开始从根目录的路径。

您也需要执行Java之前更改目录,将你的数据文件夹,或者更改字符串在代码中以指向正确的目录。