java basic io stream: la historia de OutputStream y InputStream (Wen

Descripción general de io stream:

El flujo de IO se utiliza para procesar la transmisión de datos entre dispositivos, cargar archivos y descargar archivos. Java manipula los datos en un modo de flujo. Los objetos que utiliza Java para manipular los flujos están todos en el paquete IO.

Clasificación de flujo IO

Según el flujo de datos

Flujo de entrada para leer datos

El flujo de salida escribe datos

Según tipo de datos

Flujo de bytes

Flujo de caracteres

¿Qué corriente se debe utilizar en qué circunstancias?

Si el archivo donde se encuentran los datos se abre a través del bloc de notas que viene con Windows y puede leer el contenido en su interior, utilice la secuencia de caracteres y otros utiliza la secuencia de bytes.

Si no sabe nada, utilice flujos de bytes.

IO stream clase base comúnmente utilizada

Clase base abstracta de flujo de bytes:

InputStream , OutputStream。

Clase base abstracta de flujo de caracteres:

Lector, Escritor,

Nota: Los
nombres de las subclases derivadas de estas cuatro clases tienen el sufijo del nombre de la clase principal.
Como: FileInputStream, una subclase de InputStream.
Como: FileReader, una subclase de Reader.

FileOutputStream, una subclase de OutputStream

Método de construcción:

FileOutputStream (archivo de archivo)

FileOutputStream (nombre de la cadena)

Se recomienda el segundo método de construcción:

FileOutputStream outputStream = nuevo FileOutputStream ("a.txt"); 1

Cree un objeto de flujo de salida de bytes y haga varias cosas:

A: Llame a la función del sistema para crear un archivo 
B: Cree un objeto outputStream 
C: Apunte el objeto foutputStream a este archivo 123

Escribir datos en texto a través del flujo de salida de bytes

public void write (int b) 
public void write (byte [] b) 
public void write (byte [] b, int off, int len) 123

Como se puede ver en el método, solo se puede escribir por byte

outputStream.write ("hola" .getBytes ()); hola aparece en el texto 
outputStream.write (96) // aparece en el texto un 

byte [] bys = {97,98,99,100,101}; 
outputStream.write (bys, 1, 3); bcd12345 aparece en el texto

Escriba de esta manera, los datos en el texto no se ajustarán ni adjuntarán, y cada vez que se escriba, se sobrescribirá el original.

añadir:

FileOutputStream outputStream = new FileOutputStream ("a.txt", true); 
// El segundo parámetro true está configurado para que se pueda agregar. 12

Nueva línea \ n \ r:

for (int i = 0; i <5; i ++) { 
    outputStream.write ("hola" .getBytes ()); 
    outputStream.write ("\ n \ r" .getBytes ()); 
    } 1234

Nota: recuerde cerrar la transmisión cuando haya terminado.

outputStream.close (); 1

Ejemplo completo:

package io2; 

import java.io.FileOutputStream; 
import java.io.IOException; 
/ ** 
 * new FileOutputStream ("a.txt", true); El segundo parámetro es true, configurado para escribir datos empalmados al final 
 * \ n \ r Line feed 
 * write (bys, 1,3); write byte array 
 * / 
public class out { 
    public static void main (String args []) { 
        FileOutputStream outputStream = null; 
        try { 
            // FileOutputStream fos = new FileOutputStream (archivo); 
            outputStream = new FileOutputStream ("a.txt", true); 
            / * 
             * Crear un objeto de flujo de salida de bytes y hacer varias cosas: 
             * A: llamar a la función del sistema para crear un archivo 
             * B: crear un objeto de flujo de salida 
             * C: apunte el objeto foutputStream a este archivo
             * / 

// for (int i = 0; i <5; i ++) { 
// outputStream.write ("hola" .getBytes ()); 
// outputStream.write ("\ n \ r" .getBytes ()); 
//} 
            byte [] bys = {97,98,99,100,101}; 
            outputStream.write (bys, 1,3); 
        } captura (IOException e) { 
            e.printStackTrace (); 
        } 
        finalmente { 
            prueba { 
                outputStream.close (); 
            } captura (IOException e) { 
                e.printStackTrace (); 
            } 
        } 


    } 
} 12345678910111213141516171819202122232425262728293031323334353637383940414243

Subclase de InputStream FileInputStream

Método de construcción FileInputStream

FileInputStream (archivo de archivo) 
FileInputStream (nombre de cadena) 12

Se recomienda el segundo método de construcción:

 FileInputStream inputStream = nuevo FileInputStream ("a.txt"); 1

Ahora lea los datos que acaba de escribir en la consola:

public int read () 
public int read (byte [] b) 12

La primera lectura es leer un byte y la segunda lectura es leer una matriz de bytes.

// 读 一个 字节
int por = 0; 
while ((por = inputStream.read ())! = - 1) { 
      System.out.println ((char) by); 
} 12345

Si no hay datos, devolverá -1, lo que se utiliza para juzgar si la lectura ha finalizado.

// Leer una matriz de bytes, generalmente 1024 tamaño 
int len ​​= 0; 
byte [] bys = new byte [1024]; 
while ((len = inputStream.read (bys))! = -1) { 
    System.out. println (nueva cadena (bys, 0, len)); 
} 123456

Los valores de retorno de las dos lecturas son ligeramente diferentes, read () devuelve el byte leído y -1 al final de la lectura, read (byte [] b) devuelve el número de bytes leídos, el byte leído Ponlo en la matriz de bytes y devuelve -1 si no hay datos al final.

Diagrama de dos métodos de lectura:

[Error en la transferencia de la imagen del enlace externo. El sitio de origen puede tener un mecanismo de enlace anti-sanguijuela. Se recomienda guardar la imagen y subirla directamente (img-Yv0oyKLy-1603813798619) (http://p5kllyq5h.bkt.clouddn.com/ 174401.jpg)]

Cuando la transmisión se agota, debe cerrarse a tiempo para evitar el uso de la memoria.

inputStream.close (); 1

Ejemplo completo:

Se recomienda leer los datos en una matriz de bytes.

paquete io2; 

import java.io.FileInputStream; 
import java.io.FileNotFoundException; 
import java.io.IOException; 

/ ** 
 * Crear por stefan 
 * Fecha en 2018-05-27 23:00 
 * ¡Conversión sobre configuración! 
 * / 
public class input2 { 
    public static void main (String args []) { 
        FileInputStream inputStream = null; 
        try { 
            inputStream = new FileInputStream ("a.txt"); 
// byte [] bys = new byte [4]; 
// int len ​​= inputStream.read (bys); 
// System.out.println (nueva cadena (bys)); // bcd  
// System.out.println (len); // 3
// System.out.println (inputStream.read (bys)); // - 1
            int len ​​= 0; 
            byte [] bys = nuevo byte [1024]; 
            while ((len = inputStream.read (bys))! = -1) { 
                System.out.println (new String (bys, 0, len)); 
            } 
            / ** 
             * 
             Public String (byte bytes []) { this (bytes, 0, bytes.length); 
             } 
             * / 

        } catch (IOException e) { 
            e.printStackTrace (); 
        } finalmente { 
            prueba { 
                inputStream.close (); 
            } captura (IOException e) {  
                e.printStackTrace ();
            } 
        } 

    }
} 123456789101112131415161718192021222324252627282930313233343536373839404142434445

Archivo de copia de flujo de bytes

Use la secuencia de entrada para leer los bytes en un archivo y luego use la secuencia de salida para escribir los bytes leídos en otro archivo (se creará automáticamente si no existe)

paquete io2; 

import java.io.FileInputStream; 
import java.io.FileNotFoundException; 
import java.io.FileOutputStream; 
import java.io.IOException; 
import java.util.Arrays; 

/ ** 
 * Crear por stefan 
 * Fecha en 2018-05-27 23:19 
 * Conversión sobre configuración! 
 * / 
public class copy { 
    public static void main (String args []) lanza IOException { 
        FileInputStream inputStream = new FileInputStream ("E: \\ huge1.jpg"); 
        FileOutputStream outputStream = nuevo FileOutputStream ("E: \\ 古 月 .jpg"); 
        
        byte [] bytes = nuevo byte [1024]; 
        int len ​​= 0; 
        while ((len = inputStream.read (bytes))! = -1) {
            outputStream.write (bytes, 0, len); 
        }
        inputStream.close (); 
        outputStream.close (); 
    } 
} 12345678910111213141516171819202122232425262728

Nota: El método para copiar texto, imágenes, mp3, video, etc. es el mismo.

La velocidad de lectura y escritura del flujo de bytes de una matriz a la vez es obviamente mucho más rápida que la velocidad de lectura y escritura de un byte a la vez Este es el efecto de agregar un búfer como una matriz.

Cuando se diseñó Java, también tuvo en cuenta estas ideas de diseño (explicadas más adelante en el patrón de diseño decorativo), por lo que proporciona un flujo de búfer de bytes.

Flujo de salida en 
búfer de bytes 
BufferedOutputStream Flujo de entrada en búfer de bytes 
BufferedInputStream 1234

BufferedOutputStream

BufferedOutputStream bos = new BufferedOutputStream (nuevo FileOutputStream ("a.txt", verdadero)); 
bos.write ("hola mundo" .getBytes ()); 
bos.close (); 123

BufferedInputStream

BufferedInputStream bis = new BufferedInputStream (nuevo FileInputStream ("a.txt")); 
byte [] bytes = nuevo byte [1024]; 
int len ​​= 0; 
while ((len = bis.read (bytes))! = -1) { 
    System.out.println (new String (bytes, 0, len)); 
} 
bis.close (); 1234567

Nota:

  • El método de miembro es básicamente el mismo que el flujo de bytes, y la función del flujo de búfer de bytes es mejorar la eficiencia de la entrada y la salida.

  • El método de construcción puede especificar el tamaño del búfer, pero generalmente no lo usamos, porque el tamaño predeterminado del búfer es suficiente.

  • ¿Por qué no pasar un archivo o ruta de archivo específico, pero pasar un objeto OutputStream? La razón es muy simple, el flujo de búfer de bytes solo proporciona un búfer, diseñado para la eficiencia. Sin embargo, las operaciones reales de lectura y escritura deben basarse en objetos de flujo básicos.

Actualización de archivos copiados:

BufferedOutputStream bos = new BufferedOutputStream (nuevo FileOutputStream ("E: \\ modern-java.pdf")); 
BufferedInputStream bis = new BufferedInputStream (nuevo FileInputStream ("F: \\ 汤包 \\ 慕 课 大巴 \\ modern-java.pdf")); 
int len ​​= 0; 
byte [] bytes = nuevo byte [1024]; 
while ((len = bis.read (bytes))! = -1) { 
    bos.write (bytes, 0, len); 
} 
bis.close (); 
bos.close (); 123456789

Prueba: la eficacia de los cuatro tipos de archivos de copia

package io2; 

import java.io. *; 

/ ** 
 * 
 * Tiempo de copia de prueba 
 * 
 Creada por stefan * Fecha en 2018-05-28 10:28 
 * Conversión sobre configuración! 
 * / 
public class copy2 { 
    // Un byte Se necesita 22697 milisegundos para copiar un byte 
    public static void fun () lanza IOException { 
        FileInputStream fis = new FileInputStream ("F: \\ soupbag \\ modern-java.pdf"); 
        FileOutputStream fos = new FileOutputStream ("E: \\ modern- java.pdf "); 
        int by = 0; 
        while ((by = fis.read ())! = -1) { 
            fos.write (by); 
        } 
        fis.close (); 
        fos.close (); 
    } 
    / / La copia de la matriz de 1024 bytes tarda 63 milisegundos
    public static void fun1 () lanza IOException { 
        FileInputStream fis = new FileInputStream ("F: \\ soupbag \\ MO Class Bus \\ modern-java.pdf"); 
        FileOutputStream fos = new FileOutputStream ("E: \\ modern- java .pdf "); 
        int len ​​= 0; 
        byte [] bytes = nuevo byte [1024]; 
        while ((len = fis.read (bytes))! = -1) { 
            fos.write (bytes, 0, len ); 
        } 
        fis.close (); 
        fos.close (); 
    } 
    // Copia un byte por un byte, pero se necesitan 64 milisegundos para usar el flujo de búfer 
    public static void fun2 () throws IOException { 
        int by = 0; 
        BufferedOutputStream bos = new BufferedOutputStream (nuevo FileOutputStream ( "E: \\ modern-java.pdf"));
        BufferedInputStream bis = new BufferedInputStream (new FileInputStream ("F: \\ soupbag \\ bus de clase moo \\ modern-java.pdf")); 
        while ((by = bis.read ())! = -1) { 
            bos. write (by); 
        } 
        bis.close (); 
        bos.close (); 
    } 
    // Se copia la matriz de 1024 bytes y se usa el flujo almacenado en búfer. Tarda 7 milisegundos 
    public static void fun3 () throws IOException { 
        BufferedOutputStream bos = new BufferedOutputStream (new FileOutputStream ("E: \\ modern-java.pdf")); 
        BufferedInputStream bis = new BufferedInputStream (new FileInputStream ("F: \\ soupbag \\ MO Class Bus \\ modern-java.pdf")) ; 
        int len ​​= 0; 
        byte [] bytes = nuevo byte [1024]; 
        while ((len = bis.read (bytes))! = -1) {
            bos.write (bytes, 0, len); 
        } 
        bis.close (); 
        bos.close ();  
    }

    public static void main (String args []) lanza IOException { 
        long t1 = System.currentTimeMillis (); 
        fun3 (); 
        t2 largo = System.currentTimeMillis (); 
        System.out.println (t2-t1); 
    } 

} 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768

 

 

 

Supongo que te gusta

Origin blog.csdn.net/yy17822307852/article/details/112691118
Recomendado
Clasificación