Как очистить "RandomAccessFile" (Java)?

Я использую RandomAccessFile в Java:

file = new RandomAccessFile(filename, "rw");
...
file.writeBytes(...);

Как я могу гарантировать, что эти данные сбрасываются в операционную систему? Нет метода file.flush(). (Обратите внимание, что на самом деле я не ожидаю, что он будет физически записан, я доволен тем, что он сбрасывается в операционную систему, так что данные будут переживать сбой tomcat, но не обязательно при неожиданной потере мощности сервера).

Я использую Tomcat6 на Linux.

6 ответов

Решение

Единственные классы, которые обеспечивают .flush() Метод те, которые на самом деле поддерживают свои собственные буферы. Как java.io.RandomAccessFile сам не поддерживает буфер, его не нужно очищать.

Внимательно посмотрите на конструктор RandomAccessFile javadoc:

Режимы "rws" и "rwd" работают во многом как метод force(логический) класса FileChannel, передавая аргументы true и false соответственно, за исключением того, что они всегда применяются к каждой операции ввода-вывода и поэтому часто более эффективны. Если файл находится на локальном устройстве хранения, то при возвращении вызова метода этого класса гарантируется, что все изменения, внесенные в файл этим вызовом, будут записаны на это устройство. Это полезно для гарантии того, что критическая информация не будет потеряна в случае сбоя системы. Если файл не находится на локальном устройстве, такая гарантия не предоставляется.

Ты можешь использовать getFD().sync() метод.

Вот что я делаю в своем приложении:

rf.close();
rf = new RandomAccessFile("mydata", "rw");

это дает увеличение производительности в 3-4 раза по сравнению с getFd().sync() и в 5-7 раз по сравнению с режимом "rws"

точно определяет то, что предлагал первоначальный вопрос: передает несохраненные данные в ОС и из JVM. Физически не записывает на диск и поэтому не вызывает раздражающих задержек

Я достиг здесь с тем же самым любопытством.

И я действительно не могу понять, что нужно перепрограммировать в ОС и не обязательно перепрошивать на диск часть средств.

По моему мнению,

Лучшее, что соответствует концепции управляемой промывки, это getFD().sync() как сказал @AVD,

try(RandomAccessFile raw = new RandomAccessFile(file, "rw")) {
    raw.write...
    raw.write...
    raw.getFD().sync();
    raw.wirte...
}

который, по своей документации, работает очень похоже на то, что делает FileChannel#force(boolean) с true,

Сейчас "rws" а также "rwd" выглядят как они работают, как будто указав StandardOpenOption#SYNC а также StandardOpenOption#DSYNC соответственно в то время как FileChannel является open,

try(RandomAccessFile raw = new RandomAccessFile(file, "rws")) {
    raw.write...
    raw.write...
    raw.wirte...
    // don't worry be happy, woo~ hoo~ hoo~
}

Я узнал, что ты не можешь..

Некоторые связанные ссылки здесь: http://www.cs.usfca.edu/~parrt/course/601/lectures/io.html и здесь: http://tutorials.jenkov.com/java-io/bufferedwriter.html

Другие вопросы по тегам