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)。
添加回答
举报