У меня есть немного кода Java, который выводит файл XML в файловую систему, смонтированную NFS. На другом сервере, на котором файловая система смонтирована как общий ресурс Samba, запущен процесс, который опрашивает новые XML-файлы каждые 30 секунд. Если найден новый файл, он обрабатывается, а затем переименовывается в файл резервной копии. В 99% случаев файлы записываются без проблем. Однако время от времени файл резервной копии содержит частично записанный файл.
После некоторого обсуждения с некоторыми другими людьми мы предположили, что процесс, работающий на внешнем сервере, мешает выходному потоку Java при чтении файла. Они предложили сначала создать файл типа .temp, который затем будет переименован в .xml после завершения записи файла. Обычная отраслевая практика. После изменения переименовать каждый раз не получается.
Некоторые исследования показали, что файловый ввод-вывод Java вызывает ошибки при работе с файловыми системами, смонтированными NFS.
Помогите мне, гуру Java! Как решить эту проблему?
Вот некоторая актуальная информация:
- Мой процесс - Java 1.6.0_16, работающий на Solaris 10.
- Смонтированная файловая система — это 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
File newFile = new File(outputDirectory,"fileName"+".xml")
? Это может быть проблемой, потому что вы не можете переименовать файл во что-то не в каталоге... - person BobMcGee   schedule 24.11.2009