使用单独的Java进程在映射的驱动器上编写和读取文件

时间:2013-11-26 16:41:37

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

我有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();

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

我确信文件是在进程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)
    ...

1 个答案:

答案 0 :(得分:1)

根据halfbit的建议,我将这个答案用于类似的问题https://stackoverflow.com/a/9935126/669645,这解决了我的问题

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

  • 目录缓存,方法是将DirectoryCacheLifetime设置为ZERO。
  • File Not Found缓存,方法是将FileNotFoundCacheLifetime设置为ZERO。
  • 文件信息缓存,方法是将FileInfoCacheLifetime设置为ZERO。

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

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