Java 写入 Windows Server 2016 时文件上次修改时间未更新

2024-04-20

我在 Windows Server 2016 上有一个 Java 10 应用程序,它不断使用 java.util.logging 写入文件。在 Windows 文件资源管理器中,“上次修改”和“大小”列不会更新。按 [F5] 不会更新详细信息。操作系统DIR给出相同的错误答案。 右键单击>属性>详细信息给出了甚至不同(且更旧)的答案。

只运行DOSTYPE或在记事本中打开/关闭(不保存)文件,似乎会导致文件资源管理器和 DOSDIR更新。

我认为 Java 代码是正确的flush()因为 Windows Server 2008 上的 Java 8 上的相同类会导致文件资源管理器更新。跑步的时候也有TYPE和记事本我还看到与系统时钟匹配的时间戳记录,但在“上次修改”之后。

所以我假设 Windows Server 2016 有问题。您知道要检查什么吗?


所以我假设 Windows Server 2016 有问题。您知道要检查什么吗?

默认情况下,Windows 设置为以这种方式工作。从文件时间戳未在 2008 年更新,但在 2003 年更新 https://social.technet.microsoft.com/Forums/windowsserver/en-US/2b8baca2-9c1b-4d80-80ed-87a3d6b1336f/file-timestamp-not-updating-on-2008-but-does-on-2003?forum=winservergen:

2003年,在资源管理器中打开日志文件夹,您可以看到每次更新日志时时间戳和文件大小都在眼前发生变化。

在 2008 年,大多数时候,除非你以其他方式互动,否则不会有任何变化......

[snip]

是的,其中一些属性已于 2008 年被禁用。 例如,如果您想要查看/使用“上次访问”时间,则需要启用此属性的跟踪。

您可以通过将 HKLM\System\CurrentControlSet\Control\FileSystem\NtfsDisableLastAccessUpdate 设置为 0(该值为 REG_DWORD)来启用此功能。

请注意,他可能会影响繁忙文件服务器上的磁盘 IO 性能!

因此,改变行为是为了提高绩效。

来自Web 服务器性能调优 https://learn.microsoft.com/en-us/windows-server/administration/performance-tuning/role/web-server/:

系统全局开关 NtfsDisableLastAccessUpdate (REG_DWORD) 1 位于 HKLM\System\CurrentControlSet\Control\FileSystem 下,默认设置为 1。此开关通过禁用上次的日期和时间戳更新来减少磁盘 I/O 负载和延迟。文件或目录访问。 Windows Server 2016、Windows Server 2012 R2、Windows Server 2012、Windows Server 2008 R2 和 Windows Server 2008 的全新安装默认启用此设置,您无需调整它。早期版本的 Windows 没有设置此键。如果您的服务器运行的是早期版本的 Windows,或者已升级到 Windows Server 2016、Windows Server 2012 R2、Windows Server 2012、Windows Server 2008 R2 或 Windows Server 2008,则应启用此设置。

看来这个设置在 Windows Server 2016 中仍然可以使用。

我假设 Java 代码对于 flash() 是正确的,因为 Windows Server 2008 上的 Java 8 上的相同类会导致文件资源管理器更新。此外,在运行 TYPE 和记事本时,我还看到与系统时钟匹配的时间戳记录,但在“上次修改”之后。

刷新与同步不同 https://stackoverflow.com/questions/4072878/i-o-concept-flush-vs-sync. The FileHandler仅在发布每条记录后执行刷新。 Windows 未设置为强制将元数据写入文件系统。从在修改文件而不关闭文件时,文件“修改日期”属性不会更新。 https://blogs.technet.microsoft.com/asiasupp/2010/12/14/file-date-modified-property-are-not-updating-while-modifying-a-file-without-closing-it/:

在 2008 年,日志文件上的“上次修改”字段不会更新,除非另一个 程序尝试打开文件或实用程序被停止,即使按 F5 刷新视图。

资源管理器从 NTFS 获取信息,通过使用 cmd 提示符和“dir”,我们发现文件的 NTFS 元数据在文件句柄关闭之前不会更新。

刷新文件夹的信息只是转到 NTFS 缓存的(驻留在内存中的)元数据,但显式查询文件将强制磁盘 I/O 获取属性 - 这是 Vista 中引入的设计更改,以减少不必要的磁盘I/O 以提高性能

此规则有一些例外:

  • 在某些情况下(但不是全部),简单的“dir 文件名”足以刷新元数据
  • “特殊”文件夹可能会受到不同的对待,例如我们不希望有大量文件但希望能够依赖所提供的文件数据的用户配置文件
  • 内核过滤器驱动程序可能会改变行为,因为根据设计它们“添加、删除或 更改其他驱动程序的功能”

由于解决方法是让任何进程打开和关闭日志文件的句柄,因此编写了一个工具来完成此操作,并使用以下 API 获取文件信息:

  • 创建文件
  • 通过句柄获取文件信息
  • 关闭句柄

您可以尝试使用 FileHandler 创建的文件名打开 FileInputStream。

仅在文件上运行 DOS TYPE 或在记事本中打开/关闭(不保存),似乎会导致文件资源管理器和 DOS DIR 更新。

我发现从外部进程更新元数据的唯一通用方法是使用文件资源管理器选择文件 https://superuser.com/questions/1206477/open-explorer-with-file-selected-if-not-open-already交互方式:

explorer /select, c:\test\file.txt

这很可能与记事本中发生的情况非常相似。

我喜欢你使用TYPE https://learn.microsoft.com/en-us/windows-server/administration/windows-commands/type命令。您可以将其与nul https://stackoverflow.com/questions/313111/is-there-a-dev-null-on-windows忽略输出。

type filename.log > NUL

运行时有可能dir https://learn.microsoft.com/en-us/windows-server/administration/windows-commands/dir使用元数据开关可能会强制更新元数据:

dir /A /R /Q filename.log > nul
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Java 写入 Windows Server 2016 时文件上次修改时间未更新 的相关文章

  • 使用 Java 的 Apache Http 摘要身份验证

    我目前正在开发一个 Java 项目 但无法使 http 摘要身份验证正常工作 我尝试使用 Apache 网站 但没有帮助 我有一个需要 HTTP 摘要身份验证的网站 DefaultHttpClient httpclient new Defa
  • java中监视目录变化

    我正在使用 WatchService 来监视目录中的更改 特别是目录中新文件的创建 下面是我的代码 package watcher import java nio file import static java nio file Stand
  • Java Logger 未记录到 Netbeans 中的输出

    我正在 Netbeans 中使用 Maven 启动一个 Java 项目 我编写了一些代码来使用 Logger 类进行日志记录 但是 日志记录似乎不起作用 在程序开始时 我运行 Logger getLogger ProjectMainClas
  • 如何在java中将数组值排序为循环格式?

    我的数组值如下 String value 1 2 3 4 5 6 7 8 9 10 假设如果我将值 5 传递给 tat 数组 它应该按如下顺序排序 5 6 7 8 9 10 1 2 3 4 怎么办 有人帮忙吗 感谢你 你需要的就是所谓的轮换
  • 两个整数乘积的模

    我必须找到c c a b mod m a b c m 是 32 位整数 但 a b 可以超过 32 位 我正在尝试找出一种计算 c 的方法 而不使用 long 或任何 gt 32 位的数据类型 有任何想法吗 如果m是质数 事情可以简化吗 注
  • 与 Eclipse 中的 Java Content Assist 交互

    作为我的插件项目的一部分 我正在考虑与 Eclipse 在 Java 文件上显示的内容辅助列表进行交互 我正在尝试根据一些外部数据对列表进行重新排序 我看过一些有关创建新内容辅助的教程 但没有看到有关更改现有内容辅助的教程 这可能吗 如果是
  • Android:文本淡入和淡出

    我已阅读此 stackoverflow 问题和答案 并尝试实现文本淡入和淡出 Android中如何让文字淡入淡出 https stackoverflow com questions 8627211 how to make text fade
  • 为什么即使我的哈希码值相同,“==”也会返回 false

    我写了一个像这样的课程 public class HashCodeImpl public int hashCode return 1 public static void main String args TODO Auto generat
  • 如何在 JPQL 或 HQL 中进行限制查询?

    在 Hibernate 3 中 有没有办法在 HQL 中执行相当于以下 MySQL 限制的操作 select from a table order by a table column desc limit 0 20 如果可能的话 我不想使用
  • 如何在 Java 中向时间戳添加/减去时区偏移量?

    我正在使用 JDK 8 并且玩过ZonedDateTime and Timestamp很多 但我仍然无法解决我面临的问题 假设我得到了格式化的Timestamp在格林威治标准时间 UTC 我的服务器位于某处 假设它设置为Asia Calcu
  • 如何在 Spring 中使 @PropertyResource 优先于任何其他 application.properties ?

    我正在尝试在类路径之外添加外部配置属性资源 它应该覆盖任何现有的属性 但以下方法不起作用 SpringBootApplication PropertySource d app properties public class MyClass
  • 如何仅从 Firestore 获取最新更新的数据?

    在 Firestore 上发现任何更改时始终获取整个文档 如何只获取最近更新的数据 这是我的数据 我需要在第一次加载时在聊天中按对象顺序 例如 2018 09 17 30 40 msg和sendby 并且如果数据更新则仅获取新的msg和se
  • JDBC 时间戳和日期 GMT 问题

    我有一个 JDBC 日期列 如果我使用 getDate 则会得到 date 仅部分2009 年 10 月 2 日但如果我使用 getTimestamp 我会得到完整的 date 2009 年 10 月 2 日 13 56 78 890 这正
  • 将 JavaFX FXML 对象分组在一起

    非常具有描述性和信息性的答案将从我这里获得价值 50 声望的赏金 我正在 JavaFX 中开发一个应用程序 对于视图 我使用 FXML
  • 使用 HtmlUnit 定位弹出窗口

    我正在构建一个登录网站并抓取一些数据的程序 登录表单是一个弹出窗口 所以我需要访问这个www betexplorer com网站 在页面的右上角有一个登录链接 写着 登录 我单击该链接 然后出现登录弹出表单 我能够找到顶部的登录链接 但找不
  • 将 JScrollPane 添加到 JFrame

    我有一个关于向 Java 框架添加组件的问题 我有一个带有两个按钮的 JPanel 和一个添加了 JTable 的 JScrollPane 我想将这两个添加到 JFrame 中 我可以将 JPanel 添加到 JFrame 或将 JScro
  • Hibernate 本机查询 - char(3) 列

    我在 Oracle 中有一个表 其中列 SC CUR CODE 是 CHAR 3 当我做 Query q2 em createNativeQuery select sc cur code sc amount from sector cost
  • Java/Python 中的快速 IPC/Socket 通信

    我的应用程序中需要两个进程 Java 和 Python 进行通信 我注意到套接字通信占用了 93 的运行时间 为什么通讯这么慢 我应该寻找套接字通信的替代方案还是可以使其更快 更新 我发现了一个简单的修复方法 由于某些未知原因 缓冲输出流似
  • Spring RESTful控制器方法改进建议

    我是 Spring REST 和 Hibernate 的新手 也就是说 我尝试组合一个企业级控制器方法 我计划将其用作未来开发的模式 您认为可以通过哪些方法来改进 我确信有很多 RequestMapping value user metho
  • java'assert'和'if(){}else exit;'之间的区别

    java和java有什么区别assert and if else exit 我可以用吗if else exit代替assert 也许有点谷歌 您应该记住的主要事情是 if else 语句应该用于程序流程控制 而assert 关键字应该仅用于

随机推荐