访问生成目录中的文件的文件路径异常



我正在创建一个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:codejavajavalearn
                      |
                      |--srcfiledemoFileReadDemo.java
                      |--resourceshello.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---hello.xml
              |
              |---filedemo----FileReadDemo.class

下面是运行目标输出。

run:
     [java] file name=hello.xml
     [java] file path=datahello.xml
     [java] file canon path=C:codejavajavalearndatahello.xml
     [java] file abs path=C:codejavajavalearndatahello.xml
     [java] file parent=data
     [java] file length=0
     [java] is file=false
     [java] file exists:false

我期望绝对路径是

C:codejavajavalearnbuildclassesdatahello.xml

但在这里我得到了

C:codejavajavalearndatahello.xml

为什么会这样?我该怎么做才能让 Java 类使用C:\code\java\javalearn\build\classes\data\hello.xml path?

当你执行运行目标时,你的脚本正在目录 C:\code\java\javalearn\

由于该目录是脚本的当前工作目录,

并且脚本在不更改目录的情况下执行 java,因此它也是 java 的当前工作目录。

路径只是告诉 java 在哪里查找类文件。它不会更改当前工作目录。因此,当你的项目显示"new File(data/hello.xml)"时,java会在路径"./data/hello.xml"处查找该文件,并将该路径中的"."转换为目录"C:\code\java\javalearn"。只要您不从根目录开始路径,就会隐含"."。

您需要在执行 java 之前更改目录、移动数据文件夹或更改代码中的 String 以指向正确的目录。

相关内容

  • 没有找到相关文章

最新更新