Аномалия пути к файлу при доступе к файлу в директории сборки - PullRequest
0 голосов
/ 18 мая 2011

Я создаю класс 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

Я создал файл сборки, как показано ниже.

<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 открыл объект File, используя путь C: \ code \ java \ javalearn \ build \ classes \ data \ hello.xml?

1 Ответ

0 голосов
/ 18 мая 2011

Когда вы выполняете цель запуска, ваш скрипт запускается в каталоге C: \ code \ java \ javalearn \

Поскольку этот каталог является текущим рабочим каталогом для сценария, а сценарий выполняет Java без изменения каталогов, он также является текущим рабочим каталогом для Java.

Путь к классам просто говорит Java, где искать файлы классов. Это не меняет текущий рабочий каталог. Следовательно, когда ваш проект говорит «новый файл (data / hello.xml)», java ищет файл по пути «./data/hello.xml» и переводит «.» в этом пути к каталогу "C: \ code \ java \ javalearn". "." подразумевается, когда вы не запускаете путь из корневого каталога.

Вам нужно либо изменить каталог перед выполнением Java, либо переместить папку с данными, либо изменить строку в вашем коде, чтобы она указала на правильный каталог.

...