java - io conocimiento Pan de habla (archivo grande ejemplo de subida)

Artículo de referencia

  1. java ejemplo de subida de archivos grandes: https: //blog.csdn.net/j7s9usu/article/details/86678534
  2. bio-nio-AIO parte de la referencia conocimiento:
    . 1) https://www.cnblogs.com/sxkgeek/p/9488703.html
    2) https://www.jianshu.com/p/362b365e1bcc
    3) HTTPS:. // Blog .csdn.net / guanghuichenshao / artículo / detalles / 79375967
  3. mappedByteBuffer和ByteBuffer的区别:
    1) https://blog.csdn.net/love4amanda/article/details/90412482
    2) https://blog.csdn.net/qq_41969879/article/details/81629469

El conocimiento Point

  1. Síncrona y asíncrona (síncrono / asíncrono): La sincronización es un mecanismo de funcionamiento fiable y ordenada, cuando sincronizamos, la tarea de seguimiento está a la espera de las llamadas actuales a cambio, será el siguiente paso, y asíncrona, por el contrario, no es otra tarea necesidad de esperar a que la llamada actual a cambio, a menudo se basan en el evento, como un mecanismo de devolución de llamada para poner en práctica el orden de la relación entre las tareas
  2. Bloqueo y sin bloqueo: Durante el bloqueo de la operación, el flujo actual está bloqueado, no puede dedicarse a otras tareas sólo cuando las condiciones están listos para continuar, tales como el establecimiento de nuevas conexiones ServerSocket se ha completado, los datos leídos o se completa la operación de escritura, y no bloqueante IO es independientemente de que haya finalizado la operación, volver directamente, la acción apropiada para continuar el procesamiento en segundo plano

1. Clasificación corrientes io

Clasificación flujo de bytes y un flujo de caracteres
flujo de entrada de bytes: InputStream, flujo de salida de bytes: OutputStream
flujo de entrada de caracteres: Reader, el flujo de caracteres de salida: escritor

¿Qué es un flujo de bytes?

flujo de bytes - el proceso de transmisión, los datos de transmisión es una unidad básica de una corriente de bytes.

¿Cuál es el flujo de caracteres?

flujo de caracteres - el proceso de transmisión, la unidad básica de transmisión de datos es una secuencia de caracteres.

https://blog.csdn.net/chengyuqiang/article/details/79183748

flujo de caracteres búfer
https://blog.csdn.net/chenkaibsw/article/details/81606722
flujo de caracteres de manera que los datos se almacenan primero en la memoria caché, y luego se añadió a modificar el archivo de
búfer determinación
flush ()

fue 和 NIO

https://blog.csdn.net/ty497122758/article/details/78979302
https://www.cnblogs.com/zedosu/p/6666984.html
Bio: síncrono bloqueo
nio: síncrono de no bloqueo
AIO: asíncrono no bloqueante (asíncrono lectura y escritura, la memoria intermedia)

1. Sincronización: Cuando sincrónica acuerdo IO, Java IO con su propia lectura y la escritura.

2. asíncrono: cuando se utiliza S asíncrona, IO leer y escribir en Java estará a cargo de OS mango, es necesario pasar datos buffer de dirección y el tamaño del sistema operativo, el proceso de notificación de Java OS (devolución de llamada) cuando haya terminado.

3. bloqueo: Cuando usar bloqueo de llamadas IO, Java ha sido bloqueado va a escribir para completar antes de regresar.

4. Sin bloqueo: Cuando se utiliza un IO de no bloqueo, si no leer y escribir de inmediato, llamada Java volverá inmediatamente, durante la lectura y la escritura cuando la notificación de eventos distribuidor IO puede leer y escribir, leer y escribir en bucle continuo, hasta su finalización.

BIO (síncrono, de bloqueo, corriente orientada)

  1. Descripción general: Bio es operado por un io flujo de datos, flujo de datos de funcionamiento de la prensa io se divide en: un flujo de bytes, un flujo de caracteres mediante la clasificación de flujo: Entrada y Salida
  2. streams de caracteres:
    1. sólo se utilizan para los datos de texto proceso, manifestación común es el archivo
    2. Nota: cuándo utilizar la escritura flush () para refrescar; necesidad de apagar al concluir
  3. flujo de bytes:
    1. para el procesamiento de datos de medios, porque la operación es un byte, y los archivos multimedia se almacenan en bytes.
    2. La operación no puede actualizar la operación de flujo
  4. Medios para el flujo de la corriente sólo de la secuencia leen uno o más bytes, si es necesario omitir algunos bytes se han leído o releído bytes, usted tiene que leer el flujo de datos en la caché hasta

NIO (sincrónica, no-bloqueo)

  1. Información general: NIO La razón es síncrona, ya que es el método de escritura de núcleo I / O operación bloqueará el hilo actual de aceptación / lectura /, NiO hay tres componentes: Channel (Canal), tampón (tampón), selector (seleccionar dispositivo)

Channel (canal)

Channel (canal): El canal es un objeto, que puede leer y escribir datos. Puede ser visto como una corriente IO, excepto que:
. 1) Canal es bidireccional, tanto en la lectura y la escritura pueden ser, el flujo es unidireccional y
2) se puede leer de forma asíncrona Channel
3) la lectura del Canal escrituraUsted debe pasar a través de búfer objetos

Como se mencionó anteriormente, todos los datos se procesan a través de objetos de búfer, por lo que nunca se bytes se escriben directamente en el canal, por el contrario, se quiereLos datos se escriben en el búfer; Del mismo modo, no se va a leer un byte desde el canal, pero los datosLeer de Canal de búfer, y luego obtener los bytes de búfer.

Canal de Java NIO principalmente en los siguientes tipos:
FileChannel: leer datos de un archivo
DatagramChannel: protocolo de red UDP para leer y escribir datos
SocketChannel: leer los datos de protocolo de red TCP
ServerSocketChannel: conexión TCP puede monitorear

Buffer (tampón)

  1. Descripción general: En NIO, todos los datos son tratados con tampón, que se leen y escriben datos se transfieren piscina NIO. Buffer es esencialmente una matriz, por lo general una matriz de bytes, pero puede ser también otros tipos de matrices. Sin embargo, un buffer no es sólo un conjunto importante, proporciona un acceso estructurado a los datos, pero también puede leer y sistema de seguimiento de proceso de escritura.
    Aquí Insertar imagen Descripción
    Búfer de lectura y escritura de datos utilizando generalmente siguen las siguientes cuatro etapas:
    1. escribir datos en memoria intermedia;
    2. llamada Flip () método; (el filp () que la conversión buffer de escritura, de hecho, cambie la posición de la operación en la memoria intermedia y similares propiedad)
    3. los datos de la memoria intermedia;
    4. invoke método claro () o un compacto método ()

Flip () Método: tampón de conmutación desde el modo de escritura en modo de lectura, el valor de posición de reposición es 0, el valor límite se establece en el valor anterior de la posición;
Clear Buffer: método claro () o compact () llamada. método claro () despeja toda la memoria intermedia. método compacto () sólo leer datos ha sido borrada. Cualquier dato leído se trasladó al principio del búfer, los nuevos datos se escribirán de nuevo en los datos del buffer sin leer.

Buffer tiene las siguientes categorías principales:

ByteBuffer; CharBuffer; DoubleBuffer 等 ...

  1. Un símbolo importante:

Tamaño de búfer / capacidad - Capacidad
como un bloque de memoria, tampón tiene un valor de tamaño fijo indicado por la capacidad de parámetros.
lectura actual / posición de escritura - Posición
al escribir datos en la memoria intermedia, posición representa una posición de una corriente a ser escrito, la posición de la capacidad máxima - 1, cuando se leen los datos de la memoria intermedia, posición indica la posición actual de leer.
La información de ubicación al final - límite

  1. ejemplo
public static void copyFileUseNIO(String src,String dst) throws IOException{
//声明源文件和目标文件
        FileInputStream fi=new FileInputStream(new File(src));
        FileOutputStream fo=new FileOutputStream(new File(dst));
        //获得传输通道channel
        FileChannel inChannel=fi.getChannel();
        FileChannel outChannel=fo.getChannel();
        //获得容器buffer
        ByteBuffer buffer=ByteBuffer.allocate(1024);
        while(true){
            //判断是否读完文件
            int eof =inChannel.read(buffer);
            if(eof==-1){
                break;  
            }
            //重设一下buffer的position=0,limit=position
            buffer.flip();
            //开始写
            outChannel.write(buffer);
            //写完要重置buffer,重设position=0,limit=capacity
            buffer.clear();
        }
        inChannel.close();
        outChannel.close();
        fi.close();
        fo.close();
}   

Selector (objeto seleccionado)

  1. Descripción general: Debido a que el contexto del subproceso de conmutación de cabeza llega a ser significativo a alta concurrencia, la sincronización se bloquea desventajas baja escalabilidad, por lo que hay un selector, se puede registrar más de un canal al selector, el control de gestión centralizada, como este en un hilo de rosca puede ser utilizado para manejar una pluralidad de canales, y similares correspondientes a la agrupación de hebras.
  2. Creada y registrada plantilla

// 1. En primer lugar crear un selector

Selector selector = Selector.open();
//注册的Channel 必须设置成异步模式 才可以,否则异步IO就无法工作,这就意味着我们不能把一个FileChannel注册到Selector,因为FileChannel没有异步模式,但是网络编程中的SocketChannel是可以的。
channel.configureBlocking(false);
//将channel注册到选择器中,并且让选择器监听channel的read事件
SelectionKey key =channel.register(selector,SelectionKey.OP_READ);
  1. Los atributos importantes SelectionKey

Este atributo contiene los siguientes campos,

  1. El conjunto interés: es un evento específico que escuchar el canal de, por ejemplo: SelectionKey.OP_READ
  2. Una colección de las operaciones de listas: El conjunto listo
  3. El Canal: registro de canal obtención de
  4. El Selector: obtener selector
  5. Un objeto adjunto (opcional): diana de unión para la propiedad

AIO (asíncrono, no-bloqueo)

  1. Descripción general: AIO es un acrónimo de S asíncrona, aunque el NIO en funcionamiento de la red, ofrece sin bloqueo método, pero IO NIO o comportamiento síncrono. Para el NIO, el hilo cuando nuestro negocio son las operaciones de IO listos para ser notificados, y luego fueron operados por el propio proceso de IO, operación IO en sí está sincronizado.

Pero para AIO, es más un paso más allá, no es entonces informar == hilo en el IO listo, pero después que se ha completado la operación de IO, el hilo para dar aviso. == Así AIO no está bloqueado, entonces nuestra lógica de negocio se convertirá en una función de devolución de llamada, espera para una operación IO es completa, provocada automáticamente por el sistema.

¿Por NIO

problemas de concurrencia alta causada por el uso de un convencional bloqueo de I / O del sistema, si la solicitud es el uso de una convencional hilo de este modelo, una vez que un gran número de solicitudes simultáneas de alta, habrá los siguientes problemas:

1, el hilo no es suficiente, incluso si se utiliza un hilo grupo de subprocesos no ayudará a su reutilización;

2, el bloqueo de modo I / O, habrá un gran número de hilo está bloqueado, los datos han estado esperando este hilo tiempo se suspende, sólo se puede esperar, utilización de la CPU, es muy bajo, en otras palabras, la diferencia entre el rendimiento del sistema;

3, si la congestión de la red I / O de la red o si hay un fallo en la red o similar, o la fluctuación de fase, el hilo pueden estar bloqueados por un largo tiempo. Todo el sistema se vuelve poco fiable;

mappedByteBuffer y características ByteBuffer

Lea cada flujo de documentos

  1. BIO: ByteBuffer los datos que se desean copiar una pluralidad de veces; archivo de página de inicio -> memoria física (montón de memoria externa) -> memoria heap (VM) -> Operación
  2. NIO y BIO: ByteBuffer de archivo de página -> memoria física (montón de memoria externa) -> Operación
  3. mappedByteBuffer: Desde el archivo de página -> (memoria de pila externa) de memoria física -> Opciones
    En el caso en el que se puede conocer el desempeño de NIO es también muy bueno, pero sin tener en cuenta el consumo de memoria, de una sola vez lee en la memoria también mappedByteBuffer que NIO para ser más rápido.

proceso de la hoja

FileChannel proporciona un método para trazar un mapa del archivo en la memoria virtual, por lo general puede asignar todo el archivo, si el archivo es grande, puede estar segmentado mapa.

FileChannel de varias variables:
mapmode el MODO: modo de acceso archivo asignado en memoria, total de tres tipos:
MapMode.READ_ONLY: de sólo lectura, intente modificar el buffer resultante dará lugar a una excepción.
MapMode.READ_WRITE: lectura / escritura, los cambios en el buffer con el tiempo se escriben en el archivo, sin embargo, los cambios en el mapa a los otros programas del mismo archivo no es necesariamente visible.
MapMode.PRIVATE: privada, leer y escribir, pero no modifican el contenido escrito en el archivo, pero el búfer en sí cambia, esta capacidad se denomina "copiar al escribir".
Posición: posición cuando la asignación del archivo de arranque.
allocationGranularity: Memoria tamaño de asignación de memorias intermedias de mapeo , inicializado por el initIDs función nativa.

MappedByteBuffer ventajas y desventajas

  1. uso MappedByteBuffer de memoria virtual, por lo que la asignación (mapa) del tamaño de la memoria no es los límites de los parámetros JVM -Xmx, sino también un límite de tamaño.
  2. Si, cuando el archivo supera el 1,5 G límites, contenido del archivo de parámetros de posición de la espalda pueden ser re-mapa.
  3. MappedByteBuffer hecho un rendimiento muy alto cuando se trata de archivos de gran tamaño, pero hay algunos problemas, como la huella de la memoria, el archivo es cerrado incertidumbre, es única columna abierta es la recolección de basura cerrado voluntad, y este punto en el tiempo es incierto.
    Javadoc también mencionó: Un buffer de bytes y el archivo de mapeado de mapeo que representa siguen siendo válidas hasta que el mismo buffer es recolección de basura *.

la carga de archivos grandes

Proyecto Fuente: https: //github.com/jiaojiaoyow/git_demo/tree/master/big_file

Un pozo encontró:

  1. Ejecución mappedByteBuffer.put (fileData) informó [con la raíz de la causa java.nio.ReadOnlyBufferException: null} Error
    razón:
    MappedByteBuffer MappedByteBuffer = el FileChannel.map (FileChannel.MapMode.READ_ONLY, offset, fileData.length);
    en MapMode.READ_ONLY escritura mal, debe ser cambiado READ_WRITE
Publicado 36 artículos originales · ganado elogios 11 · Vistas a 10000 +

Supongo que te gusta

Origin blog.csdn.net/s_xchenzejian/article/details/104051874
Recomendado
Clasificación