Flujo IO - flujo de matriz de bytes [flujo de memoria]

1. Descripción general de los flujos de matrices de bytes

1.1 Flujo de nodos y flujo de empaquetado

 Los flujos de IO se clasifican según diferentes objetos de procesamiento y se pueden dividir en flujos de nodos y flujos de empaquetado.

1) Flujo de nodos: FileOutputStream, FileInputStream, FileWriter y FileReade

2) Flujo de empaquetado: el flujo de búfer, el flujo de conversión, el flujo de impresión, el flujo de datos y el flujo de objetos pertenecen a él.

Los flujos de nodos se pueden operar con flujos de paquetes, por ejemplo:

Usar flujos de bytes para copiar archivos es ineficiente, por lo que podemos usar flujos almacenados en búfer para mejorar la eficiencia.

Usar flujos de bytes para acceder a datos de cualquier tipo es engorroso, por lo que podemos usar flujos de objetos para simplificar las operaciones, etc.

1.2 Descripción general de los flujos de matriz de bytes

 Flujo de matriz de bytes , que también es un flujo de nodos .

====================== ¿El flujo de matriz de bytes se divide en? ==================================

1) Flujo de entrada: ByteArrayInputStream

2) Flujo de salida: ByteArrayOutputStream

======================Consejos? =========================================

Cuando se utiliza un flujo de matriz de bytes, para mejorar la eficiencia y simplificar las operaciones, el flujo de matriz de bytes se puede utilizar junto con el flujo de empaquetado .

====================== ¿Cuál es la diferencia entre el resto del flujo de nodos y el flujo de matriz de bytes? =====================

Entre los flujos de nodos comunes, por ejemplo: FileInputStream y FileReader usan "archivo" como fuente de datos , mientras que ByteArrayInputStream usa la "matriz de bytes" en la memoria como fuente de datos .

======================¿Cómo se implementa el flujo de matriz de bytes? ============================

Un flujo de matriz de bytes es un flujo relacionado con una matriz en la memoria . Puede escribir matrices de bytes en el flujo de salida o leer matrices de bytes del flujo de entrada sin involucrar el disco. El flujo de salida de la matriz de memoria puede considerarse como una matriz de bytes que se expande automáticamente, en la que se pueden escribir bytes.

======================¿Cuál es el uso de los flujos de matriz de bytes? ==============================

A través de la transmisión de matrices de bytes, podemos convertir entre todos los tipos de datos (tipos de datos básicos, tipos de datos de referencia) y matrices de bytes , y luego convertirlos en matrices de bytes que se pueden guardar en archivos o transmitir a la red.

2. Clase ByteArrayOutputStream

Lógica subyacente ByteArrayOutputStream

ByteArrayOutputStream El flujo de salida de la matriz de bytes crea un búfer de matriz de bytes en la memoria y todos los datos enviados al flujo de salida se guardan en el búfer de matriz de bytes. El tamaño predeterminado del búfer es de 32 bytes cuando se inicializa, que crecerá automáticamente a medida que los datos se escriben continuamente. Sin embargo, la capacidad máxima del búfer es 2 G. Siempre que los datos no excedan los 2 G, puede escribir en él.

Una vez escritos los datos, puede utilizar el método toByteArray() o el método toString() para obtener los datos, logrando así la conversión de cualquier tipo de datos en una matriz de bytes .

Por ejemplo, dada una matriz de bytes y luego colocando varios datos en la matriz, como números enteros, tipos booleanos, tipos de punto flotante, cadenas y objetos, etc., este requisito se puede cumplir utilizando ByteArrayOutputStream.

[Ejemplo] Estudio de caso de conversión de cualquier tipo de datos en una matriz de bytes

clase pública ArrayStreamTest {

    público estático vacío principal (String [] argumentos) {

        prueba {

            // Flujo de salida de matriz de bytes (flujo de nodo), que puede convertir cualquier tipo de datos en una matriz de bytes

            ByteArrayOutputStream baos = nuevo ByteArrayOutputStream();

            // Flujo de búfer (clase contenedora), utilizado para mejorar la eficiencia

            BufferedOutputStream bos = nuevo BufferedOutputStream(baos);

            // Flujo de objetos (flujo de empaquetado) para escribir cualquier tipo de datos

            ObjectOutputStream oos = nuevo ObjectOutputStream(bos);

            //Utiliza flujo de objetos para escribir datos

            este.writeInt(123);

            oos.writeDouble(123.45);

            oos.writeChar('A');

            oos.writeBoolean( falso );

            oos.writeUTF("nodo");

            oos.writeObject( nueva fecha());

            // Actualizar la secuencia. Debe actualizar la secuencia antes de obtener los datos porque se utiliza una secuencia contenedora.

            oos.flush();

            // recuperar datos

            byte [] bs = baos.toByteArray();

            Sistema. fuera .println(Arrays. toString (bs));

        } captura (IOException e) {

            e.printStackTrace();

        }

    }

}

Al observar el código fuente subyacente, encontramos que el método close() de la clase ByteArrayOutputStream no estaba implementado, por lo que la secuencia aún se puede usar después de llamar al método close() para cerrarla.

三、ByteArrayInputStream

El flujo de entrada de la matriz de bytes es envolver un byte [] de la matriz de bytes para que tenga las propiedades de una secuencia. Puede leerse secuencialmente y marcarse para saltar hacia atrás y continuar leyendo. Su función principal es leer la matriz de bytes. Los datos .

Del mismo modo, cerrar ByteArrayInputStream no es válido. Aún se puede llamar al método close() después de cerrar la secuencia.

[Ejemplo] Leer la matriz de caracteres obtenida en el caso anterior

clase pública ArrayStreamTest {

    público estático vacío principal (String [] argumentos) {

        prueba {

            // Obtiene la matriz de bytes y devuelve la matriz de bytes escrita a través del flujo de salida de la matriz de bytes en el caso anterior

            byte[] bs = outputStreamMethod();

            // 字节数组输入流(节点流),用于读取字节数组中的数据

            ByteArrayInputStream bios = new ByteArrayInputStream(bs);

            // 缓冲流(包装类),用于提高效率

            BufferedInputStream bis = new BufferedInputStream(bios);

            // 对象流(包装流),实现读取指定类型的数据

            ObjectInputStream ois = new ObjectInputStream(bis);

            // 读取数据

            System.out.println(ois.readInt());

            System.out.println(ois.readDouble());

            System.out.println(ois.readChar());

            System.out.println(ois.readBoolean());

            System.out.println(ois.readUTF());

            System.out.println(ois.readObject());

        } catch (IOException e) {

            e.printStackTrace();

        } catch (ClassNotFoundException e) {

            e.printStackTrace();

        }

    }

}

补充,ByteArrayInputStream和ByteArrayOutputStream是字节数组流,那么与之对应的字符数组流则是StringReader和StringWriter。

与字节数组流相比,字符数组流反而用得更少,因为StringBuilder和StringBuffer也能方便的用来存储动态长度的字符,而且大家更熟悉这些类。

 

 

Supongo que te gusta

Origin blog.csdn.net/shengshanlaolin_/article/details/127466119
Recomendado
Clasificación