【问题标题】:Writing and reading files on mapped drives with separate Java processes使用单独的 Java 进程在映射驱动器上写入和读取文件
【发布时间】:2013-11-26 16:41:36
【问题描述】:

我有 java 进程 1,它使用 rpc 调用 java 进程 2,它在映射的网络驱动器上创建一个文件。进程 1 然后尝试读取该文件。通常该文件可以正常读取,但有时即使我可以看到它确实已创建,它也找不到该文件。

进程 1、2 和映射的驱动器分别位于不同的 Windows Server 2008 机器上。因此,这些进程位于不同的 JVM 和不同的操作系统上。

进程 2 在返回之前会做这种事情(意味着它确保文件在从 rpc 调用返回之前写入磁盘):

FileOutputStream fileOut = new FileOutputStream(new File(pdfPath));
bufferedOut = new BufferedOutputStream(fileOut);
// write to file
bufferedOut.flush();
fileOut.getFD().sync();
bufferedOut.close();

进程 1 将在 rpc 方法调用返回后尝试读取文件。

我确定文件是在进程 1 尝试读取文件之前写入的,但是 JVM 或操作系统中正在发生一些缓存,这会阻止进程检测文件

在我尝试读取文件之前没有错误,它看起来像这样:

java.io.IOException: G:/mydir/my file ( 1.pdf not found as file or resource.
    at com.itextpdf.text.pdf.RandomAccessFileOrArray.<init>(RandomAccessFileOrArray.java:113)
    at com.itextpdf.text.pdf.RandomAccessFileOrArray.<init>(RandomAccessFileOrArray.java:80)
    at com.itextpdf.text.pdf.PRTokeniser.<init>(PRTokeniser.java:112)
    at com.itextpdf.text.pdf.PdfReader.<init>(PdfReader.java:169)
    at com.itextpdf.text.pdf.PdfReader.<init>(PdfReader.java:159)
    ...

【问题讨论】:

  • 如果进程没有检测到文件,那么您可能应该包含一些错误消息。
  • 太棒了...听起来和我的问题一模一样...我会试一试
  • @halfbit 请随时添加该链接作为答案
  • 这是不可能的:“简单的答案转换为评论。”但是对评论的支持可能足以让其他人走上正轨。 - 或者回答自己并添加一些细节?

标签: java windows file jvm windows-server-2008


【解决方案1】:

按照 halfbit 的建议,我用这个答案回答了一个类似的问题 https://stackoverflow.com/a/9935126/669645,这解决了我的问题

解决方案是在所有机器上禁用 SMB2 缓存。为此,我在 HKEY_LOCAL_MACHINE\system\CurrentControlSet\Services\LanmanWorkstation\Parameters 下的注册表中添加了以下 DWORD 记录:

  • 目录缓存,通过将 DirectoryCacheLifetime 设置为零。
  • 文件未找到缓存,通过将 FileNotFoundCacheLifetime 设置为零。
  • 文件信息缓存,通过将 FileInfoCacheLifetime 设置为零。

注意。要修改注册表,您需要打开注册表编辑器:在开始菜单的搜索框中输入“regedit”并运行 regedit.exe

更多信息可以在以下链接中找到:

【讨论】:

    猜你喜欢
    • 2023-04-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多