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

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

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

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

Я использую tomcat6 в Linux.

6 ответов


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


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

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


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


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

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

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

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


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

по-моему,

лучшая вещь соответствует понятию управлял промывки is 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