Java 删除文件然后创建文件时,创建日期不会更改

Java 删除文件然后创建文件时,创建日期不会更改,java,file,Java,File,由于某些原因,我必须删除旧文件,并根据我们的客户创建新文件 修改的日期更改为当前时间,但创建的日期未更改为当前时间 我的代码如下 public static void main(String args[]) throws Exception { FileUtils.deleteQuietly(new File("d:\\inbox\\json\\test.txt")); FileWriter fileWriter = new FileWriter("d:\\inbox\\j

由于某些原因,我必须删除旧文件,并根据我们的客户创建新文件

修改的日期更改为当前时间,但创建的日期未更改为当前时间

我的代码如下

  public static void main(String args[]) throws Exception {
    FileUtils.deleteQuietly(new File("d:\\inbox\\json\\test.txt"));
    FileWriter fileWriter = new FileWriter("d:\\inbox\\json\\test.txt", false);
    fileWriter.append(new Date().toString());
    fileWriter.close();
  }
此代码删除旧数据并写入新数据

但为什么创建日期和时间不更改

请帮我找出我的代码有什么问题。
提前感谢。

在写入文件之前,您不能删除该文件

如果在重新创建文件之前不删除该文件,则只需对其进行修改。

您将附加到在给定日期创建的文件,而不是创建新文件(这将为您提供一个创建日期)。您要做的是将原始文件的内容复制到某个位置(例如数组)删除该文件,然后编写一个包含所有原始内容以及您希望附加内容的新文件

尽管您的描述暗示这不是您希望此代码执行的操作,但您的描述暗示您希望删除旧文件并仅包含新内容,在这种情况下,您将执行以下操作:

public static void main(String args[]) throws Exception {
        File f=new File("d:\\inbox\\json\\test.txt");
        if (f.exists()) {
            f.delete();
        }
        f.createNewFile();
        FileWriter fileWriter = new FileWriter("d:\\inbox\\json\\test.txt", false);
        fileWriter.write(new Date().toString());
        fileWriter.close();
    }
您的
createNewFile()
调用不会删除现有文件,它只会创建一个新文件,但其中一个文件不存在

您需要执行以下操作:

if (f.exists()) {
    f.delete();
}

我还没试过这个。但我相信这是因为您的文件对象没有被垃圾收集

File f = new File("test.txt");
if(f.exists()){
f.delete();
}
现在这真的很重要。您不需要创建新文件。这不会分配给相同的内存地址后,你已经钻研了第一个

File f2 = new File("test.txt");
f2.write bla bla.

我希望您的代码没有删除该文件,然后只是附加到未删除的文件。要检查这一点,我建议更改代码

FileWriter fileWriter = new FileWriter("d:\\inbox\\json\\test.txt", false);
fileWriter.append(new Date().toString());
fileWriter.close();


如果您在控制台中看到
存在:true
,这就是出现问题的原因。

这是NTFS问题。系统正在缓存文件信息,并在重新创建文件时重用它

见中的备注部分

NTFS格式的驱动器可能会在短时间内缓存有关文件的信息,如文件创建时间。因此,如果要覆盖或替换现有文件,可能需要显式设置文件的创建时间

问候

PS:您可以使用以下命令来查看它,而不使用Java代码:

del test.txt

echo test > test.txt

dir /TC test.txt

这是由于windows中的文件系统隧道造成的。有一些选项可以禁用/配置它。你可以从这个链接获得更多信息

为了用java的方式解决这个问题,您可以在创建文件后立即设置文件创建时间(文件属性),如下代码所示

public static void main(String args[]) throws Exception {
        final String FILE_PATH = "d:\\test.txt";
        FileUtils.deleteQuietly(new File(FILE_PATH));
        FileWriter fileWriter = new FileWriter(FILE_PATH, false);
        fileWriter.append(new Date().toString());
        fileWriter.close();
        setFileCreationTime(FILE_PATH);

    }

    public static void setFileCreationTime(String filePath) throws IOException {
        Path path = Paths.get(filePath);
        FileTime fileTime = FileTime.fromMillis(System.currentTimeMillis());
        /* Changing the Created Time Stamp */
        Files.setAttribute(path, "basic:creationTime", fileTime,
                LinkOption.NOFOLLOW_LINKS);
    }

希望这有帮助。

对不起,我错放了错误的代码,现在我更新了代码,请帮助我,我也尝试了
//文件。删除(path.get(“d:\\inbox\\json\\test.txt”);//Files.deleteIfExists(path.get(“d:\\inbox\\json\\test.txt”)请帮助我为什么会遇到这个问题?我的代码中是否需要任何更改?我也尝试了forceDelete,但结果是创建了相同的旧文件时间戳。请帮助。我在删除文件后添加了延迟。如果延迟为15000,则文件创建时间更改;如果延迟为14000,则文件创建时间不更改。为什么系统会有这样的行为。我尝试过,但同样的问题我尝试过设置
f=null
,然后使用
system.gc()
运行垃圾收集器,但仍然存在同样的问题。@faith OP存在:false和commons io的FileUtils.delete文件看起来您的文件系统可能有问题?你的代码对我有用。你试过另一个文件吗?您的驱动器是否使用ntfs?@faith是的,我尝试了不同的文件,我有
ntfs
文件系统。+1为了您为我找到解决方案,这可能是一个原因,但在使用文件从windows删除和创建文件时,请探索为什么此时存在正确的创建时间,因为操作系统使用不同的功能。请解释一下。我不知道文件资源管理器是如何工作的,也不知道它是如何处理文件系统的,但让我们试着用以下命令创建一个.bat文件:del test.txt echo test>test.txt dir/TC test.txt,您可以看到这不是Java的问题。@SintoKltteera完美的答案谢谢您的帮助。有一个小问题是其他操作系统(例如unix)也存在同样的问题,雨衣。。。。因为当我搜索时,我发现unix操作系统没有存储创建时间!!!!
public static void main(String args[]) throws Exception {
        final String FILE_PATH = "d:\\test.txt";
        FileUtils.deleteQuietly(new File(FILE_PATH));
        FileWriter fileWriter = new FileWriter(FILE_PATH, false);
        fileWriter.append(new Date().toString());
        fileWriter.close();
        setFileCreationTime(FILE_PATH);

    }

    public static void setFileCreationTime(String filePath) throws IOException {
        Path path = Paths.get(filePath);
        FileTime fileTime = FileTime.fromMillis(System.currentTimeMillis());
        /* Changing the Created Time Stamp */
        Files.setAttribute(path, "basic:creationTime", fileTime,
                LinkOption.NOFOLLOW_LINKS);
    }