Suplemento de flujo IO

Tutorial de Java en la estación b: https://www.bilibili.com/video/BV18J411W7cE?t=4&p=303

1 caja

  • Los datos de la fuente de datos no provienen necesariamente del archivo
  • El destino de los datos no es necesariamente un archivo

2 caso de archivo

  • Copiar carpeta de un solo nivel
  • Copiar carpetas de varios niveles
  • import java.io.*;
    
    public class CopyFoldersDemo {
        public static void main(String[] args) throws IOException {
            //数据源
            File srcFile = new File("E:\\itcast");
            //目的地
            File destFile = new File("F:\\");
            copyFolder(srcFile,destFile);
        }
        //复制文件夹
        public static void copyFolder(File srcFile, File destFile) throws IOException {
            if(srcFile.isDirectory()){
                String srcFileName = srcFile.getName();
                File newFolder = new File(destFile,srcFileName);
                if(!newFolder.exists()){
                    newFolder.mkdir();
                }
                File[] fileArray = srcFile.listFiles();
                for(File file : fileArray){
                    copyFolder(file, newFolder);
                }
            }else{
                File newFile = new File(destFile,srcFile.getName());
                copyFile(srcFile,newFile);
            }
        }
    
        public static void copyFile(File srcFile, File destFile) throws IOException {
            BufferedInputStream bis = new BufferedInputStream(new FileInputStream(srcFile));
            BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(destFile));
            byte[] bys = new byte[1024];
            int len;
            while((len = bis.read(bys)) != -1){
                bos.write(bys,0,len);
            }
            bos.close();
            bis.close();
        }
    }

     

  • Manejo de excepciones de archivos copiados

    •  

3 Flujo de operación especial

  • Flujo de entrada estándar
    • InputStream final estático público en
    • Por lo general, la secuencia corresponde a la entrada del teclado u otra fuente de entrada especificada por el entorno del host o el usuario
  • Flujo de salida estándar
    • PrintStream final estático público
    • Por lo general, la secuencia corresponde a la salida de pantalla u otro destino de salida especificado por el entorno del host o el usuario
  • Flujo de impresión
    • Secuencia de impresión de bytes PrintStream
    • Secuencia de impresión de caracteres PrintWriter
    • Características del flujo de impresión: solo responsable de la salida de datos, no de la lectura de datos; tiene su propio método único
    • Si el flujo de impresión de bytes usa el método que hereda la clase principal (flujo de salida de bytes) para escribir datos, se transcodificará cuando se visualice; use su propio método único para escribir los datos, y los datos visualizados se generarán como están
  • Flujo de serialización de objetos
    • Si un objeto quiere ser serializado, la clase a la que pertenece el objeto debe implementar la interfaz Serializable; Serializable es solo una interfaz de identificación. Si una clase implementa la interfaz Serializable, el objeto de esta clase se puede serializar y deserializar. No hay El método necesita ser reescrito
  • Después de serializar un objeto con el flujo de serialización de objetos, si modificamos el archivo de clase al que pertenece el objeto, ¿habrá problemas para leer los datos?
    • Se generará una excepción: InvalidClassException: esta clase de excepción se lanza cuando se detecta uno de los siguientes problemas con la clase durante el tiempo de ejecución de la serialización: la versión en serie de la clase no coincide con el tipo de descriptor de clase leído de la secuencia; el La clase contiene un tipo de datos Desconocido; esta clase no tiene un constructor sin parámetros al que se pueda acceder.
    • El tiempo de ejecución de serialización asocia un número de versión con cada clase serializable, llamada serialVersionUID, que se usa en el proceso de deserialización para verificar si el remitente y el receptor del objeto serializado han cargado objetos que son compatibles con la serialización del tipo. Si el receptor ya ha cargado una clase para un objeto con un serialVersionUID diferente correspondiente a la categoría del remitente, la deserialización dará como resultado una InvalidClassException.
  • ¿Qué debo hacer si algo sale mal?
    • Una clase serializable puede declarar explícitamente su propio serialVersionUID declarando un campo llamado "serialVersionUID", que debe ser de tipo static, final y long.
    • private static final long serialVersionUID = ... 
    • Si la clase serializable no declara explícitamente serialVersionUID, el tiempo de ejecución de serialización calculará el valor serialVersionUID predeterminado de la clase de acuerdo con todos los aspectos de la clase descritos en la especificación de serialización de objetos Java (TM). Se recomienda encarecidamente que todas las clases serializables declaren explícitamente el valor serialVersionUID, porque el cálculo predeterminado de serialVersionUID es muy sensible a los detalles de la clase, y el serialVersionUID declarado se modifica mejor con privado.
  • Si el valor de una variable miembro en un objeto no quiere ser serializado, ¿cómo debería implementarse?
    • La variable se modifica con la palabra clave transitoria y la variable marcada con la palabra clave no participa en la serialización.

4 propiedades

  • Heredado de Hashtable <Object, Object>;
  • Propiedades: es una clase de colección del sistema de mapas, que se puede guardar en la ruta o cargar desde la ruta;
  • Uso de propiedades como colección de mapas
    • No se puede especificar genérico
    • El tipo predeterminado es el tipo de objeto

5 caso

  •  
  •  

Supongo que te gusta

Origin blog.csdn.net/mugeit/article/details/114159648
Recomendado
Clasificación