2011-05-18 66 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之前更改目錄,將你的數據文件夾,或者更改字符串在代碼中以指向正確的目錄。