2012-03-16 6 views
6

Parece que la implementación real de close() está escondida en algún lugar de la jerarquía de las clases base y las implementaciones de métodos abstractos. Por ejemplo, ¿tiene garantizado que se libere el descriptor de archivo? Aquí es lo más parecido a lo que quería saber:¿Cómo funciona InputStreamReader.close() de forma interna?

nd.preClose(fd); 
    long th; 
    if ((th = readerThread) != 0) 
    NativeThread.signal(th); 
    if ((th = writerThread) != 0) 
    NativeThread.signal(th); 
    if (!isRegistered()) 
    kill(); 

de DatagramChannelImpl. ¿Alguien puede traducir al inglés?

Respuesta

4

Así que cada vez que buceo fuente código de Sun Java de Oracle estoy decepcionado. nd como nombre de variable? No se vuelve más opaco que eso.

Lo nd se hace referencia es NativeDispatcher que se ocupa de las operaciones específicas de plataforma, tales como el cierre de descriptores de archivos (amablemente llamado la variable fd). Solo puedo suponer que la comprobación y señal de NativeThread es limpiar los hilos de lectura/escritura, la fuente no presta mucha información. El isRegistered() de AbstractSelectableChannel se asegura de que el canal no se esté utilizando y el método kill es lo que cierra todo y finalmente llama al nd.close (fd);

0

Desde Javadoc: "Cierra la secuencia y libera los recursos del sistema asociados con ella". El archivo FD es un recurso del sistema. Ergo se cierra.