1 回答

TA貢獻1963條經驗 獲得超6個贊
AFAIK,OpenJDK 和 Orale JDK 的來源幾乎相同。rename0
因此,您可以在此處找到實現:
#include <stdlib.h>
JNIEXPORT jboolean JNICALL
Java_java_io_UnixFileSystem_rename0(JNIEnv *env, jobject this,
jobject from, jobject to)
{
jboolean rv = JNI_FALSE;
WITH_FIELD_PLATFORM_STRING(env, from, ids.path, fromPath) {
WITH_FIELD_PLATFORM_STRING(env, to, ids.path, toPath) {
if (rename(fromPath, toPath) == 0) {
rv = JNI_TRUE;
}
} END_PLATFORM_STRING(env, toPath);
} END_PLATFORM_STRING(env, fromPath);
return rv;
}
你可以看到它實際上是在調用 libc 的rename
. 由于大部分環境使用glibc
,這里是文檔:
rename 的一個有用特性是,newname 的含義從任何以前存在的具有該名稱的文件“原子地”更改為它的新含義(即,名為 oldname 的文件)。newname 在舊含義和新含義“之間”的任何時刻都不存在。如果在運行過程中出現系統崩潰,則有可能兩個名字都還存在;但如果 newname 存在的話,它將永遠是完整的。
也許你的代碼是安全的,只要它不崩潰,并且文件系統工作正常。但是,這可能取決于您使用的文件系統(例如 nfs)。
添加回答
舉報