我有一点Java代码输出XML文件NFS装文件系统。另一个服务器上这一具有filesytem装作Samba共享,有一个运行的进程,投票,为新的XML文件,每30秒钟。如果一个新的文件被发现,它是处理,然后重新命名为一个备份文件。99%的时间,该文件是书面的而不是一个问题。然而,每一个现在和以后的备份文件包含一个部分编写的文件。

经过一番讨论后,与其他一些人,我们猜到了,上运行的进程的外部服务器干扰Java输出流时阅读该文件。他们建议首先创造的文件的类型。temp那么这将被重新命名。xml文件后编写完成。一个常见的行业实践。改变之后,重新命名失败每一次。

一些研究打开了该Java文件I/O越野车在工作时与NFS装文件系统。

帮我Java大师!我怎么解决这个问题?

这里是一些相关信息:

  • 我过程Java1.6.0_16上运行Solaris10
  • 安装的文件系统是一个NAS
  • 服务器与投票过程是Windows服务器2003年R2标准,服务包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
有帮助吗?

解决方案

你可能已经指定的完整的路径,在新的文件名称:

File newFile = new File(outputDirectory + fileName + ".xml");

其他提示

这看起来像一个错误,对我说:

File oldFile = new File(outputDirectory + fileName + ".temp");
File newFile = new File(fileName + ".xml");

我希望这样的:

File oldFile = new File(outputDirectory + fileName + ".temp");
File newFile = new File(outputDirectory + fileName + ".xml");

在一般情况下,这听起来像是一个之间的竞争条件编写的XML文件和阅读/程序/重新命名的任务。你可以拥有阅读/程序/重新命名任务只操作上的文件>1分钟旧的或类似的东西吗?

或者,有Java程序写出来一个额外的空文件一旦完成写作出的XML文件的信号,编写XML文件已经完成。只读/程序/重新命名XML文件的时候信号的文件是存在的。然后删除的信号的文件。

原来的错误肯定听起来像一个问题与同时访问的文件--解决方案应该有工作,但还有替代解决方案。

例如,把一个计时器上你的自动读的过程,因此它在一个新的文件是检测它的记录filesize,睡X秒钟,然后如果大小的不符合重新启动计时器。应避免问题的部分文件传输。

编辑:或检查的时间戳为预上述检查,但确定它的旧不够的,任何不准确的时间戳没关系(说,10秒1分钟,因为最后的修改)。

或者,试试这个:

File f = new File("foo.xml");
FileOutputStream fos = new FileOutputStream(f);
FileChannel fc = fos.getChannel();
FileLock lock = fc.lock();
(DO FILE WRITE)
fis.flush();
lock.release();
fos.close();

这应该使用本地操作系统的文件锁定,以防止并行访问的其他方案(例如XML读程序).

尽NFS故障:有一个记录"要素"(错误)的文件不能移动之间的文件系统通过"重新命名"。有可能出现混淆,因为它是在一个NFS文件系统?

一些信息,以NFS一般。根据你的NFS设置的锁可不是在所有的工作和大量的大NFS装置并调整用于阅读的性能,因此新数据可能会把晚于预期,由于高速缓存的影响。

我已经看到效果你创建了一个文件,加入数据(这是上看到的另一个机),但所有数据之后,出现了一个30秒的延迟。

最好的解决方案的方式是一个旋转的文件架构。所以,最后一个是假定是书面和前一个是安全的书面和可被读取。我不会的工作在一个单一的文件,并使用它作为一个"管道"。

你可以选择使用的空白文件编写后的大型文件的编写和正确关闭。所以如果小家伙是存在的,这个大家伙是明确的完成和可以阅读。

可能是由于"重新命名操作可能无法将文件从一个文件系统的另一个"从 http://java.sun.com/j2se/1.5.0/docs/api/java/io/File.html#renameTo%28java.io.File%2) 尝试使用apache commons io FiltUtils.copyFileToDirectory http://commons.apache.org/io/api-release/org/apache/commons/io/FileUtils.html#copyFileToDirectory(java.io.File,%20java.io.File) 而不是

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top