Есть ли способ написать файл атомарно в Java на Linux? - PullRequest
0 голосов
/ 14 мая 2019

Linux Api имеет флаг O_TMPFILE, который указывается системным вызовом open, создавая временный файл без имени, который не может быть открыт ни одним путем.Таким образом, мы можем использовать это для записи данных в файл "atmoically" и 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 Ответ

2 голосов
/ 14 мая 2019

Я не верю, что у Java есть API для этого, и, похоже, это зависит от поддержки ОС и файловой системы, поэтому JNI может быть единственным способом, и даже тогда только в Linux.

Я сделал быстрый поиск того, что делает Cygwin, похоже, что-то вроде хака, просто для того, чтобы заставить программное обеспечение работать, создавая файл со случайным именем, а затем исключая его только из собственного списка каталогов.

Я считаю, чтоСамое близкое, что вы можете получить на простом Java, - это создать файл в каком-то другом месте (что-то вроде /proc/self/fd/... эквивалента), а затем, когда вы закончите его писать, либо переместите его, либо символически свяжите его с конечным местоположением.Чтобы переместить файл, вы хотите, чтобы он находился в том же разделе файловой системы, чтобы содержимое файла на самом деле не нужно было копировать.Программы, просматривающие файл, скажем, /tmp/, не увидят его до тех пор, пока не будет создано перемещение или символическая ссылка.

Возможно, вы можете поиграться с учетными записями пользователей и разрешениями файловой системы, чтобы гарантировать, что никакая другая (не SYSTEM / root) программа не сможет увидеть файл изначально, даже если они попытались посмотреть, где бы вы его ни спрятали.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...