A, programación Java base de nio

En primer lugar, ¿cuál es nio

1.NIO es una posible alternativa a la norma API Java IO de API IO (empezando a partir de Java 1.4), NIO ofrece diferente estándar IO IO de trabajo, NIO: Canales y búferes (canal y tampón)

Dos, contrastes nio con io

IO

NIO

Stream-orientado

orientado a Buffer

El bloqueo de IO

No bloqueo IO

no

selector

 

En tercer lugar, el acceso a datos búfer

El 1.java NIO Buffer principalmente para interactuar con el canal NIO, los datos se leen desde el canal en el tampón, el tampón en el canal de escritura, como una matriz de Buffer puede almacenar una pluralidad del mismo tipo de datos. Dependiendo del tipo (boolean excluido), las siguientes subclases tampón utilizado:

ByteBuffer

CharBuffer

ShortBuffer

IntBuffer

LongBuffer

FloatBuffer

DoubleBuffer

2.buffer general

1) Capacidad (capacidad): Buffer indica la capacidad máxima de datos, tampón capacidad no puede ser negativo, y no puede ser establecido y modificado.

2) límite (límite): un primer índice no debe ser leído o datos, es decir, los datos no se pueden localizar después del límite de escritura escrito. Restringir el tampón no puede ser negativo, y no puede ser mayor que su capacidad (capacidad).

3) la localización (posición): El siguiente lectura o escritura de los datos de índice. ubicación Buffer no puede ser negativo, y no puede ser mayor que su límite (límite).

4) marcas (Mark) y restablecer (Reset): Es un método índice del marcador () para especificar una posición específica en el búfer Buffer por la marca, entonces puede ser restaurado mediante una llamada al método reset () en esta posición.

3. Código

/**
 * (缓冲区)buffer 用于NIO存储数据 支持多种不同的数据类型 <br>
 * 1.byteBuffer <br>
 * 2.charBuffer <br>
 * 3.shortBuffer<br>
 * 4.IntBuffer<br>
 * 5.LongBuffer<br>
 * 6.FloatBuffer <br>
 * 7.DubooBuffer <br>
 * 上述缓冲区管理的方式 几乎<br>
 * 通过allocate() 获取缓冲区 <br>
 * 二、缓冲区核心的方法 put 存入数据到缓冲区 get <br> 获取缓冲区数据 flip 开启读模式
 * 三、缓冲区四个核心属性<br>
 * capacity:缓冲区最大容量,一旦声明不能改变。 limit:界面(缓冲区可以操作的数据大小) limit后面的数据不能读写。
 * position:缓冲区正在操作的位置
 */
public class test001 {
    public static void main(String[] args) {
        //1.指定缓冲区的大小1024
        ByteBuffer byteBuffer = ByteBuffer.allocate(1024);
        System.out.println("-------------------");
        System.out.println(byteBuffer.position());
        System.out.println(byteBuffer.limit());
        System.out.println(byteBuffer.capacity());
        // 2.向缓冲区存放5个数据
        byteBuffer.put("abcd1".getBytes());
        System.out.println("--------------------");
        System.out.println(byteBuffer.position());
        System.out.println(byteBuffer.limit());
        System.out.println(byteBuffer.capacity());
        // 3.开启读模式
        byteBuffer.flip();
        System.out.println("----------开启读模式...----------");
        System.out.println(byteBuffer.position());
        System.out.println(byteBuffer.limit());
        System.out.println(byteBuffer.capacity());
        byte[] bytes = new byte[byteBuffer.limit()];
        byteBuffer.get(bytes);
        System.out.println(new String(bytes, 0, bytes.length));
        System.out.println("----------重复读模式...----------");
        byteBuffer.rewind();
        System.out.println(byteBuffer.position());
        System.out.println(byteBuffer.limit());
        System.out.println(byteBuffer.capacity());
        byte[] bytes2 = new byte[byteBuffer.limit()];
        byteBuffer.get(bytes2);
        System.out.println(new String(bytes2, 0, bytes2.length));
        // 5.clean 清空缓冲区  数据依然存在,只不过数据被遗忘
        System.out.println("----------清空缓冲区...----------");
        byteBuffer.clear();
        System.out.println(byteBuffer.position());
        System.out.println(byteBuffer.limit());
        System.out.println(byteBuffer.capacity());
        System.out.println((char)byteBuffer.get());
    }
}

4. resultados

-------------------
0
1024
1024
--------------------
5
1024
1024
----------开启读模式...----------
0
5
1024
abcd1
----------重复读模式...----------
0
5
1024
abcd1
----------清空缓冲区...----------
0
1024
1024
a

5. Análisis

5.1. Este paso es en realidad cuando comenzamos este tiempo de inicialización de la matriz del separador, este es el inicio predeterminada

 5.2. Sin embargo, cuando se va amortiguar matriz para comenzar a escribir unos pocos bytes cuando se convierta en el siguiente gráfico, la posición se moverá a la siguiente posición del extremo de sus datos.

5. 3. Esta vez tiene que escribir el búfer de datos de canal en la tubería, así que esta vez tenemos que utilizar este método byteBuffer.flip () cuando haya terminado de llamar a este método, esta vez se convertirá en el siguiente el mapa, por lo que en realidad se puede saber que acabas de escribir a los datos de memoria intermedia está en la posición ----> entre el límite (resultado de la lectura repetible es el mismo).

5.4. En este caso el sistema operativo subyacente puede leer estos cinco bytes de datos enviados desde el búfer correctamente. Antes de escribir los datos en el siguiente ajuste al método clear (). El estado tampón índice ha vuelto a su posición inicial.

Cuatro, hacer uso del resto de

1. Marca (Mark) y reset (reinicio): es un método índice del marcador () para especificar una posición específica en el búfer Buffer por la marca, a continuación, se puede restaurar mediante una llamada al método reset () en esta posición.

2. Código

public class Test002 {
    public static void main(String[] args) {
        ByteBuffer buf = ByteBuffer.allocate(1024);
        String str = "abcd1";
        buf.put(str.getBytes());
        // 开启读取模式
        buf.flip();
        byte[] dst = new byte[buf.limit()];
        buf.get(dst, 0, 2);
        buf.mark();
        System.out.println(new String(dst, 0, 2));
        System.out.println(buf.position());
        System.out.println("---------------------------");
        buf.get(dst, 2, 2);
        System.out.println(new String(dst, 2, 2));
        System.out.println(buf.position());
        buf.reset();
        System.out.println("重置恢复到mark位置..");
        System.out.println(buf.position());
    }
}

3. resultados

ab
2
---------------------------
cd
4
重置恢复到mark位置..
2

En quinto lugar, el final de la

1. continuará la próxima programación Java NIO explicar la base de la diferencia entre la seguridad y el tampón de memoria intermedia directa y no directa. Siempre mantenga la fe !!!

Publicados 122 artículos originales · ganado elogios 64 · Vistas a 50000 +

Supongo que te gusta

Origin blog.csdn.net/chenmingxu438521/article/details/103967066
Recomendado
Clasificación