Witam wszystkich Rozumiem, że jeśli czytamy bajty z InputStream i skończymy czytać wszystkie bajty (lub nie zamierzamy czytać do końca strumienia), musimy wywołać close(), aby zwolnić zasoby systemowe powiązane ze strumieniem.Czy strumienie są automatycznie zamykane w przypadku błędu?
Teraz zastanawiałem się, czy mogę read bajtów i rzuca java.io.IOException, czy nadal muszę zadzwonić pod numer close(), aby zwolnić zasoby systemowe związane ze strumieniem?
Czy to prawda, że w przypadku błędów strumienie są zamykane automatycznie, więc nie musimy dzwonić pod numer close()?
Zasoby są zamknięte gdy GCed. W związku z tym możesz mieć problem, który rzadko rzuca wyjątek w pracy. W przypadku deterministycznego zarządzania zasobami funkcja close() powinna być zawsze wywoływana. –
@PeterLawrey Mówisz, że to **, ponieważ ** GC po cichu zjada wyjątek IOException przez 'close()', który powinniśmy nazwać 'close()' sami? Więc jeśli (hipotetycznie) interfejs close() nie rzuca żadnej formy wyjątku, nie musimy wywoływać close(), gdy strumień ma błąd? – Pacerier
Jest to coś, co należy wziąć pod uwagę, jednak dość powszechną praktyką jest zignorowanie wyjątku wygenerowanego przez close(). Problem z zezwoleniem GC na to, że możesz uruchomić nasze uchwyty plików zanim wyzwolisz GC, który wyczyści te zasoby. Twój program może działać, ale czasami kończy się niepowodzeniem i jest to coś, czego chcesz uniknąć. –