我有一些 Java 代码将 XML 文件输出到 NFS 安装的文件系统。在将文件系统挂载为 Samba 共享的另一台服务器上,有一个进程正在运行,每 30 秒轮询一次新的 XML 文件。如果找到新文件,则会对其进行处理,然后将其重命名为备份文件。99% 的情况下,文件的写入没有问题。但是,备份文件时不时地包含一个部分写入的文件。
在与其他人讨论后,我们猜测外部服务器上运行的进程在读取文件时干扰了 Java 输出流。他们建议首先创建一个 .temp 类型的文件,然后在文件写入完成后将其重命名为 .xml。一种常见的行业惯例。更改后,每次重命名都失败。
一些研究表明,在使用 NFS 挂载的文件系统时,Java 文件 I/O 存在错误。
帮助我Java大师!我该如何解决这个问题?
以下是一些相关信息:
- 我的进程是在 Solaris 10 上运行的 Java 1.6.0_16
- 挂载的文件系统是 NAS
- 具有轮询过程的服务器是 Windows Server 2003 R2 Standard,Service Pack 2
这是我的代码示例:
//Write the file
XMLOutputter serializer = new XMLOutputter(Format.getPrettyFormat());
FileOutputStream os = new FileOutputStream(outputDirectory + fileName + ".temp");
serializer.output(doc, os);//doc is a constructed xml document using JDOM
os.flush();
os.close();
//Rename the file
File oldFile = new File(outputDirectory + fileName + ".temp");
File newFile = new File(fileName + ".xml");
boolean success = oldFile.renameTo(newFile);
if (!success) {
// File was not successfully renamed.
throw new IOException("The file " + fileName + ".temp could not be renamed.");
}//if