2015-10-19 14 views
5

W Javie, gdy ktoś dzwoni pod numer AsynchronousFileChannel.write(...), otrzymuje Future, który można następnie poczekać do zakończenia przez Future.get().Kiedy napis AsynchronousFileChannel "complete"?

Kiedy zostanie zwrócone to wywołanie get(), czy zapis został zapisany na dysku, czy tylko pamięć podręczna strony?

Jeśli to ma znaczenie, szczególną platformą, którą jestem ciekawy, jest Linux & ext4.

Odpowiedz

1

Sprawdź tę dokumentację:

https://docs.oracle.com/javase/7/docs/api/java/nio/channels/AsynchronousFileChannel.html#force(boolean)

Wygląda nawet po get metoda zwraca na Future, istnieją pewne niektóre buforuje na poziomie systemu operacyjnego, który może zapobiec zawartość być zapisywane na dysku . Jeśli chcesz być naprawdę pewny, myślę, że powinieneś zrobić force po zwrocie Future.

Stosowny fragment:

Sił wszelkie aktualizacje do pliku tego kanału mają być zapisywane w pamięci urządzenie, które zawiera go. Jeśli plik tego kanału znajduje się w lokalnym urządzeniu pamięci masowej , to po zwróceniu tej metody jest gwarantowane, że wszystkie zmiany wprowadzone do pliku , ponieważ ten kanał został utworzony, lub od ostatniego wywołania tej metody , zostaną zapisane na tym urządzeniu. Ten numer jest przydatny do zapewnienia, że ​​krytyczne informacje nie zostaną utracone w przypadku awarii systemu.

Jeśli plik nie znajduje się na urządzeniu lokalnym, nie ma takiej gwarancji .

Parametr metaData może służyć do ograniczenia liczby operacji we/wy , które ta metoda musi wykonać. Przekazywanie fałszywe dla ten parametr wskazuje, że tylko aktualizacje zawartości pliku wymagają zapisania w pamięci; ; Przekazanie wartości true oznacza, że ​​muszą zostać zapisane aktualizacje zarówno pliku, jak i metadanych pliku , co zazwyczaj wymaga co najmniej jednej operacji we/wy. Niezależnie od tego, czy ten parametr rzeczywiście ma wartość , każdy efekt zależy od systemu operacyjnego i dlatego jest nieokreślony.

Wywołanie tej metody może spowodować operację we/wy, nawet jeśli kanał został otwarty tylko do odczytu. Niektóre systemy operacyjne, na przykład dla przykładu , utrzymują czas ostatniego dostępu jako część metadanych pliku, a ten czas jest aktualizowany za każdym razem, gdy plik jest czytany. To, czy faktycznie jest to wykonywane, zależy od systemu i dlatego jest nieokreślone.

Ta metoda gwarantuje tylko wymuszenie zmian wprowadzonych w tym pliku kanału metodami zdefiniowanymi w tej klasie.

Powiązane problemy