Pytanie Czy kiedykolwiek widziałeś zamknięcie pliku Java (), rzucając wyjątek?


Czy kiedykolwiek ktoś widział wyjątek wygenerowany podczas wywoływania metody close na każdym zamkniętym obiekcie?


20
2018-05-04 13:31


pochodzenie




Odpowiedzi:


Na IOException zostanie rzucony close jeśli finał flush zawiedzie. Możliwe przyczyny to:

  • system plików jest pełny lub użytkownik przekroczył limit,
  • błędy dysku twardego,
  • system plików został przymusowo odmontowany,
  • zdalny system plików jest niedostępny z powodu problemów sieciowych lub innych problemów,
  • (być może) błąd kodowania znaków, jeśli zapisujesz do pliku przez OutputStreamWriter lub podobne,
  • błąd urządzenia, jeśli "plik" jest plikiem urządzenia,
  • utracone połączenie, jeśli zamykany jest strumień sieciowy,
  • pęknięta rura, jeśli zamykana jest rura do zewnętrznego procesu,
  • i tak dalej.

Z pewnością widziałem niektóre z nich. Inne są mało prawdopodobne.

Jeśli jednak dane, które piszesz, są ważne, powinieneś na to pozwolić close w braku. Na przykład, jeśli twoja aplikacja wypisuje plik krytyczny, system plików zapełnia się, twoja aplikacja lepiej to zauważyła, zanim zastąpi starą kopię pliku wersją skróconą.


25
2018-05-04 13:41



Ciekawy.... - Tom Brito


Tak, IMHO nie jest tak rzadkie, jeśli pracujesz z czymś innym niż z nielokalnymi plikami na dysku.

Close () działa, jeśli w tym momencie twoje zamknięcie jest nadal ważne i otwarte. Wiele rzeczy, takich jak rury, zdalne pliki itp., Może umrzeć przedwcześnie.

Ponadto widziałem kod, który ignoruje błędy przy otwieraniu i zapisie i nadal próbuje zamknąć (np. W bloku finally).


6
2018-05-04 13:35





Nie mam, ale jest to możliwe. Wyobraź sobie, że istnieje OutputStream który z jakiegoś powodu nie napisał jeszcze do pliku. Cóż, dzwonienie close() wypróżni dane, ale jeśli plik jest zablokowany - wtedy an IOException zostałoby podniesione.


4
2018-05-04 13:34





Nie pod względem plików, ale pod względem gniazd zbliża się koniec IOException kiedy druga strona przerwała połączenie. Na przykład, gdy uruchamiasz żądanie HTTP na dużej (dużej) stronie internetowej, a następnie od razu odjeżdżasz, klikając inny link na stronie (gdy nie jest on zakończony ładowaniem), wtedy strona serwera otrzyma IOException (lub podobną podklasę ClientAbortException w serwerach Tomcat i klonach), gdy strumień wyjściowy odpowiedzi HTTP ma zostać przepłukany / zamknięty.


4
2018-05-04 13:43





Stary post i od dawna nie ma odpowiedzi, ale oto prawdziwy przykład:

Poniższy kod będzie wyjątkiem, gdy wywoływana jest funkcja bufferedWriter.close (). Dzieje się tak, ponieważ bazowy program zapisujący BufferedWriter (FileWriter) został już zamknięty i po zamknięciu BufferedWriter, najpierw próbuje spłukać wszelkie dane w swoim buforze do bazowego Writera.

File newFile = new File("newFile.txt");

FileWriter fileWriter = new FileWriter(newFile);
BufferedWriter bufferedWriter = new BufferedWriter(fileWriter);

bufferedWriter.write("Hello World");

fileWriter.close();
bufferedWriter.close();

Uwaga: Jeśli nie ma danych w buforze [skomentuj linię write () lub dodaj wywołanie flush ()] wtedy nie będzie generowany żaden wyjątek


4
2018-01-06 23:11



+1 za faktyczne podanie przykładu. - sleske


Sądzę, że możesz spróbować to wymusić, odłączając dysk, na którym znajduje się twój plik. Ale na każdym Closable? Myślę, że łatwo byłoby uzyskać coś, co używa gniazda do wyrzucenia wyjątku po zamknięciu.


2
2018-05-04 13:33





Spróbuj wyszarpnąć dysk USB z otwartym plikiem. Jeśli nie da wyjątku, byłbym bardzo zaskoczony.


2
2018-05-04 18:21





Mam - w mojej jednostce testy przeciwko mockom;)


0
2018-05-04 18:15