Как очистить "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 соответственно, за исключением того, что они всегда применяются к каждой операции ввода-вывода и поэтому часто более эффективны. Если файл находится на локальном устройстве хранения, то при вызове метода этого класса возвращается гарантируется, что все изменения, внесенные в файл, что вызов будет записан на это устройство. Это полезно для обеспечения того, чтобы критическая информация не терялась в случае сбоя системы. Если файл не находится на локальном устройстве, такая гарантия не предоставляется.
вот что я делаю в своем приложении:
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