有没有办法在Linux上的Java中自动写入文件?

时间:2019-05-14 16:13:44

标签: java linux file io

Linux Api具有O_TMPFILE标志,可通过open系统调用指定该标志,以创建未命名的临时文件,该文件无法通过任何路径打开。因此,我们可以使用它来“自动”将数据写入文件,并将给定文件linkat写入真实路径。根据打开的手册页,它可以实现得很简单

char path[1000];
int fd = open("/tmp", O_TMPFILE | O_WRONLY, S_IWUSR);
write(fd, "123456", sizeof("123456"));
sprintf(path, "/proc/self/fd/%d", fd);
linkat(AT_FDCWD, path, AT_FDCWD, "/tmp/1111111", AT_SYMLINK_FOLLOW);

是否有Java替代品(可能是非跨平台的)可以对文件进行原子写入而无需编写特定于Linux的JNI函数? Files.createTempFile做的事情完全不同。

通过原子写入,我的意思是它要么无法打开无法读取,要么包含所有需要写入的数据。

1 个答案:

答案 0 :(得分:2)

我不相信Java具有此功能的API,而且它似乎依赖于操作系统和文件系统是否具有支持,因此JNI可能是唯一的方法,甚至在Linux上也是如此。

我快速搜索了Cygwin的功能,似乎只是为了使软件能够正常工作,创建一个具有随机名称的文件,然后仅将其排除在自己的目录列表之外。

我相信使用普通Java可以得到的最接近的结果是在其他位置创建文件(类似/proc/self/fd/...的形式),然后在完成编写后移动或符号链接它从最终位置开始。要移动文件,您需要将其放在相同的文件系统分区上,因此实际上不需要复制文件内容。监视/tmp/中的文件的程序只有在创建move或sym链接后才能看到它。

您可能会试着使用用户帐户和文件系统权限,以确保其他(非SYSTEM / root)程序最初不会看到该文件,即使它们试图在您隐藏的任何位置查找该文件。