2015-05-15 18 views
6

Podczas każdej zmiany treści w polu JTextArea piszę do File. Postanowiłem otworzyć i zamknąć zawartość pliku za każdym razem, zgodnie ze zdarzeniem zmiany.Otwieranie i zamykanie tego samego pliku wiele razy vs Otwieranie pliku przez długi czas

Coś,

public void addToLogFile(String changeContent) { 
    try { 
     PrintWriter pw = new PrintWriter(new BufferedWriter(new FileWriter(currentLogFile,true))); 
     pw.print(changeContent); 
     pw.close(); 
    } catch (FileNotFoundException ex) { 
     Logger.getLogger(Main.class.getName()).log(Level.SEVERE, null, ex); 
    } catch (IOException ex) { 
     Logger.getLogger(Main.class.getName()).log(Level.SEVERE, null, ex); 
    } 
} 

Zamiast otwierania i zamykania przy każdym pliku, myślałem może moglibyśmy otworzyć go w fazie początkowej i zrzucić zawartość w dowolnym momencie. Wreszcie zamknij go w fazie końcowej.

W początkowej fazie programu:

PrintWriter pw = new PrintWriter(new BufferedWriter(new FileWriter(currentLogFile,true))); 

Następnie gdzieś w kodzie, gdzie to konieczne,

pw.print(changeContent); // Most frequent usage 

w ostatniej fazie programu:

pw.close(); 

Która jeden będzie bardziej wydajny ? W jakim stanie, Czy muszę wybrać jeden?

+3

Zachowaj to, nie ma wątpliwości. – EJP

Odpowiedz

4

Skuteczniejsze byłoby otwarcie pliku raz. Otwieranie pliku za każdym razem jest dość kosztowne.

Jeden przypadek może być przydatny, gdy nowe wpisy do pliku zdarzą się raz na jakiś czas, więc system operacyjny nie musi obsługiwać otwartych procedur obsługi plików.

Innym przypadkiem, w którym rozważałbym otwieranie i zamykanie go za każdym razem, jest sytuacja, gdy zapisy zdarzają się nie tak często i chcesz, aby inne procesy zapisywały się do pliku. A może kiedy chcesz upewnić się, że każda pozycja jest widoczna zaraz po jej zapisaniu, ale powinieneś raczej po prostu przepłukać bufor.

3

Pozostawienie otwartego pliku będzie opcjonalne, jeśli masz wiele z tych pól tekstowych, gdzie każdy z nich jest przypisany do innego pliku. Następnie, jeśli liczba pól tekstowych zbliża się do limitu otwartych plików, prawdopodobnie twój program nie będzie mógł otworzyć żadnych innych plików, gniazd ani innych elementów, gdy każde z pól zajmie jeden deskryptor pliku.

Ale, oczywiście, jest to kwestia czysto teoretyczna. Limit otwartych plików wynosi zwykle około 2000 i trudno mi sobie wyobrazić aplikację z 2000 pól wprowadzania tekstu.

To powiedziawszy, wczesne wersje narzędzia unix find zadbały o zamknięcie, a następnie ponowne otwarcie katalogów przetaktowanych, aby uniknąć problemów z rozpraszaniem plików. Ale to było na początku, kiedy limit wynosił 20 lat.