¿Cómo puedo saber si no hay datos para leer en Netty ByteBuf?

Soy nuevo en Netty. Hay un problema sobre la transferencia de archivos que me confunde por días. Quiero enviarimage archivo del cliente al servidor.

El siguiente código es ejecutable. Pero solo yoapaga servidor por la fuerza puedo abrir el archivo de imagen recibido normalmente. De lo contrario, muestra " Parece que no tiene permiso para ver este archivo. Verifique los permisos e intente nuevamente ". Así que quiero cerrar el flujo de salida de archivos cuando no hay datos en ByteBuf usando ByteBuf.isReadable (), pero el bloque else en el método channelRead en ServerHandler nunca llega. Es inutil

Además, si envíatext archivo, se puede abrir normalmente cuando el servidor esviv. No quiero apagar el servidor cada vez después de la transferencia. Por favor, dame algunas sugerencias para resolverlo.

Este es FileClientHandler

public class FileClientHandler extends ChannelInboundHandlerAdapter {

private int readLength = 8;

@Override
public void channelActive(ChannelHandlerContext ctx) throws Exception {
    sendFile(ctx.channel());
}

private void sendFile(Channel channel) throws IOException {
    File file = new File("C:\\Users\\xxx\\Desktop\\1.png");
    FileInputStream fis = new FileInputStream(file);
    BufferedInputStream bis = new BufferedInputStream(fis);

    for (;;) {
        byte[] bytes = new byte[readLength];
        int readNum = bis.read(bytes, 0, readLength);
        // System.out.println(readNum);
        if (readNum == -1) {
            bis.close();
            fis.close();
            return;
        }
        sendToServer(bytes, channel, readNum);
    }
}

private void sendToServer(byte[] bytes, Channel channel, int length)
        throws IOException {
    channel.writeAndFlush(Unpooled.copiedBuffer(bytes, 0, length));
}

}

Este es FileServerHandler

public class FileServerHandler extends ChannelInboundHandlerAdapter {

private File file = new File("C:\\Users\\xxx\\Desktop\\2.png");
private FileOutputStream fos;

public FileServerHandler() {
    try {
        if (!file.exists()) {
            file.createNewFile();
        } else {
            file.delete();
            file.createNewFile();
        }
        fos = new FileOutputStream(file);
    } catch (IOException e) {
        e.printStackTrace();
    }
}

@Override
public void channelRead(ChannelHandlerContext ctx, Object msg)
        throws Exception {
    try {
        ByteBuf buf = (ByteBuf) msg;
        if (buf.isReadable()) {
            buf.readBytes(fos, buf.readableBytes());
            fos.flush();
        } else {
            System.out.println("I want to close fileoutputstream!");
            buf.release();
            fos.flush();
            fos.close();
        }

    } catch (Exception e) {
        e.printStackTrace();
    }
}
}

Respuestas a la pregunta(1)

Su respuesta a la pregunta