Flujos y archivos

16
Sección 14.1 Introducción • Los datos que se almacenan en variables y arreglos son temporales; se pierden cuando una variable local queda fuera de alcance, o cuando el programa termina. Las computadoras utilizan archivos para la retención a largo plazo de grandes cantidades de datos, incluso después de que los programas que crearon los datos terminan de ejecutarse. • Los datos persistentes que se mantienen en archivos existen más allá de la duración de la ejecución del programa. • Las computadoras almacenan los archivos en dispositivos de almacenamiento secundario, como los discos duros. Sección 14.2 Jerarquía de datos • El elemento de datos más pequeño en una computadora puede asumir el valor 0 o 1, y se le conoce como bit. En última instancia, una computadora procesa todos los elementos de datos como combinaciones de ceros y unos. • El conjunto de caracteres de la computadora es el conjunto de todos los caracteres que se utilizan para escribir programas y representar datos. • Los caracteres en Java son Unicode y están compuestos de dos bytes, cada uno de los cuales se compone de ocho bits. • Así como los caracteres están compuestos de bits, los campos se componen de caracteres o bytes. Un campo es un grupo de caracteres o bytes que transmite un signifi cado. • Los elementos de datos procesados por las computadoras forman una jerarquía de datos, la cual se vuelve más grande y compleja en estructura, a medida que progresamos de bits a caracteres, luego a campos, y así en lo sucesivo. • Por lo general, varios campos componen un registro (que se implementa como class en Java). • Un registro es un grupo de campos relacionados. • Un archivo es un grupo de registros relacionados. • Para facilitar la obtención de registros específi cos de un archivo, se elije por lo menos un campo en cada registro como clave. Una clave de registro identifi ca que un registro pertenece a una persona o entidad específi ca, y es único para cada registro.

Transcript of Flujos y archivos

Page 1: Flujos y archivos

Sección 14.1 Introducción• Los datos que se almacenan en variables y arreglos son temporales; se pierden cuando una variable local queda fuerade alcance, o cuando el programa termina. Las computadoras utilizan archivos para la retención a largo plazo degrandes cantidades de datos, incluso después de que los programas que crearon los datos terminan de ejecutarse.• Los datos persistentes que se mantienen en archivos existen más allá de la duración de la ejecución del programa.• Las computadoras almacenan los archivos en dispositivos de almacenamiento secundario, como los discos duros.Sección 14.2 Jerarquía de datos• El elemento de datos más pequeño en una computadora puede asumir el valor 0 o 1, y se le conoce como bit. Enúltima instancia, una computadora procesa todos los elementos de datos como combinaciones de ceros y unos.• El conjunto de caracteres de la computadora es el conjunto de todos los caracteres que se utilizan para escribir programasy representar datos.• Los caracteres en Java son Unicode y están compuestos de dos bytes, cada uno de los cuales se compone de ochobits.• Así como los caracteres están compuestos de bits, los campos se componen de caracteres o bytes. Un campo es ungrupo de caracteres o bytes que transmite un signifi cado.• Los elementos de datos procesados por las computadoras forman una jerarquía de datos, la cual se vuelve más grandey compleja en estructura, a medida que progresamos de bits a caracteres, luego a campos, y así en lo sucesivo.• Por lo general, varios campos componen un registro (que se implementa como class en Java).• Un registro es un grupo de campos relacionados.• Un archivo es un grupo de registros relacionados.• Para facilitar la obtención de registros específi cos de un archivo, se elije por lo menos un campo en cada registrocomo clave. Una clave de registro identifi ca que un registro pertenece a una persona o entidad específi ca, y es únicopara cada registro.• Existen muchas formas de organizar los registros en un archivo. La más común se llama archivo secuencial, en el cuallos registros se almacenan en orden, en base al campo clave de registro.• Por lo general, a un grupo de archivos relacionados se le denomina base de datos. Una colección de programasdiseñados para crear y administrar bases de datos se conoce como sistema de administración de bases de datos(DBMS).Sección 14.3 Archivos y flujos• Java ve a cada archivo como un flujo secuencial de bytes.• Cada sistema operativo cuenta con un mecanismo para determinar el fi n de un archivo, como un marcador de fi n

Page 2: Flujos y archivos

de archivo o la cuenta de los bytes totales en el archivo, que se registra en una estructura de datos administrativa,manejada por el sistema.• Los flujos basados en bytes representan datos en formato binario.• Los flujos basados en caracteres representan datos como secuencias de caracteres.• Los archivos que se crean usando flujos basados en bytes son archivos binarios. Los archivos que se crean usandoflujos basados en caracteres son archivos de texto. Los archivos de texto se pueden leer mediante editores de texto,mientras que los archivos binarios se leen mediante un programa que convierte esos datos en un formato legible paralos humanos.• Java también puede asociar los flujos con distintos dispositivos. Tres objetos fl ujo se asocian con dispositivos cuandoun programa de Java empieza a ejecutarse: System.in, System.out y System.err.• El paquete java.io incluye definiciones para las clases de fl ujos, como FileInputStream (para la entrada basadaen bytes de un archivo), FileOutputStream (para la salida basada en bytes hacia un archivo), FileReader (para la entradabasada en caracteres de un archivo) y FileWriter (para la salida basada en caracteres hacia un archivo). Losarchivos se abren creando objetos de estas clases de flujos.Sección 14.4 La clase File• La clase File se utiliza para obtener información acerca de los archivos y directorios.• Las operaciones de entrada y salida basadas en caracteres se pueden llevar a cabo con las clases Scanner y Formatter.• La clase Formatter permite mostrar datos con formato en la pantalla, o enviarlos a un archivo, de una manerasimilar a System.out.printf.• La ruta de un archivo o directorio especifi ca su ubicación en el disco.• Una ruta absoluta contiene todos los directorios, empezando con el directorio raíz, que conducen hacia un archivoo directorio específi co. Cada archivo o directorio en una unidad de disco tiene el mismo directorio raíz en su ruta.• Por lo general, una ruta relativa empieza desde el directorio en el que se empezó a ejecutar la aplicación.• Un carácter separador se utiliza para separar directorios y archivos en la ruta.Sección 14.5 Archivos de texto de acceso secuencial• Java no impone una estructura en un archivo; las nociones como los registros no existen como parte del lenguaje deJava. El programador debe estructurar los archivos para satisfacer los requerimientos de una aplicación.• Para obtener datos de un archivo en forma secuencial, los programas comúnmente empiezan a leer desde el principiodel archivo y leen todos los datos en forma consecutiva, hasta encontrar la información deseada.

Page 3: Flujos y archivos

• Los datos en muchos archivos secuenciales no se pueden modifi car sin el riesgo de destruir otros datos en el archivo.Por lo tanto, los registros en un archivo de acceso secuencial normalmente no se actualizan directamente en su ubicación.En vez de ello, se vuelve a escribir el archivo completo.Sección 14.6 Serialización de objetos• Java cuenta con un mecanismo llamado serialización de objetos, el cual permite escribir o leer objetos completosmediante un fl ujo.• Un objeto serializado es un objeto que se representa como una secuencia de bytes, e incluye los datos delobjeto, así como información acerca del tipo del objeto y los tipos de datos almacenados en el mismo.• Una vez que se escribe un objeto serializado en un archivo, se puede leer del archivo y deserializarse; es decir,se puede utilizar la información de tipo y los bytes que representan al objeto para recrearlo en la memoria.• Las clases ObjectInputStream y ObjectOutputStream, que implementan en forma respectiva a las interfacesObjectInput y ObjectOutput, permiten leer o escribir objetos completos de/a un fl ujo (posiblemente unarchivo).• Sólo las clases que implementan a la interfaz Serializable pueden serializarse y deserializarse con objetosObjectOutputStream y ObjectInputStream.Sección 14.7 Clases adicionales de java.io• La interfaz ObjectOutput contiene el método writeObject, el cual recibe un objeto Object que implementa a lainterfaz Serializable como argumento y escribe su información en un objeto OutputStream.• La interfaz ObjectInput contiene el método readObject, que lee y devuelve una referencia a un objeto Objectde un objeto InputStream. Una vez que se ha leído un objeto, su referencia puede convertirse al tipo actual delobjeto.• El uso de búfer es una técnica para mejorar el rendimiento de E/S. Con un objeto BufferedOutputStream, cadainstrucción de salida no necesariamente produce una transferencia física real de datos al dispositivo de salida. En vezde ello, cada operación de salida se dirige hacia una región en memoria llamada búfer, la cual es lo bastante grandecomo para contener los datos de muchas operaciones de salida. La transferencia actual al dispositivo de salida serealiza entonces en una sola operación de salida física extensa cada vez que se llena el búfer.• Con un objeto BufferedInputStream, muchos trozos “lógicos” de datos de un archivo se leen como una sola operaciónde entrada física extensa y se colocan en un búfer de memoria. A medida que un programa solicita cada nuevo

Page 4: Flujos y archivos

trozo de datos, se obtiene del búfer. Cuando el búfer está vacío, se lleva a cabo la siguiente operación de entrada físicareal desde el dispositivo de entrada, para leer el nuevo grupo de trozos “lógicos” de datos.Resumen 645646 Capítulo 14 Archivos y fl ujosSección 14.8 Abrir archivos con JFileChooser• La clase JFileChooser se utiliza para mostrar un cuadro de diálogo, que permite a los usuarios de un programaseleccionar archivos con facilidad, mediante una GUI.aplicación de acceso directoapuntador de posición de archivoarchivoarchivo binarioarchivo de acceso secuencialarchivo de procesamiento por lotesarchivo de sólo lecturaarchivo de textoarchivos de acceso directoarreglo de bytes envueltobase de datosbit (dígito binario)búferbúfer de memoriabyte, tipo de datoscampoCANCEL_OPTION, constante de la clase JFileChoosercanRead, método de la clase FilecanWrite, método de la clase Filecapacidad-classpath, argumento de línea de comandos para java-classpath, argumento de línea de comandos parajavacclave de registroconjunto de caracteresconjunto de caracteres ASCII (Código estándar estadounidensepara el intercambio de información)DataInput, interfazDataInputStream, claseDataOutput, interfazDataOutputStream, clasedatos persistentesdígito decimalDIRECTORIES_ONLY, constante de la clase JFileChooserdirectoriodirectorio padredirectorio raízdiscodisco ópticodispositivos de almacenamiento secundario

Page 5: Flujos y archivos

EndOfFileException, excepciónenvoltura de objetos fl ujoexists, método de la clase Fileexit, método de la clase SystemFile, claseFileInputStream, claseFileOutputStream, claseFileReader, claseFILES_AND_DIRECTORIES, constante de la clase JFile-ChooserFILES_ONLY, constante de la clase JFileChooserFileWriter, clasefl ujo basado en bytesfl ujo basado en caracteresfl ujo de bytesFormatter, clasegetAbsolutePath, método de la clase FilegetName, método de la clase FilegetParent, método de la clase FilegetPath, método de la clase FilegetSelectedFile, método de la clase JFileChooserInputStream, claseinterfaz de marcadoIOException, excepciónisAbsolute, método de la clase FileisDirectory, método de la clase FileisFile, método de la clase Filejava.io, paquetejerarquía de datosJFileChooser, claseJFileChooser, cuadro de diálogolastModified, método de la clase Filelength, método de la clase Filelist, método de la clase Filemarcador de fi n de archivonombre de directorioNoSuchElementException, excepciónObjectInputStream, claseObjectOutputStream, claseobjeto deserializadoobjeto fl ujoobjeto fl ujo de error estándarobjeto serializadooperación física de entradaoperación física de salidaoperaciones lógicas de entradaoperaciones lógicas de salidaOutputStream, clasepathSeparator, campo static de la clase FilePrintStream, clase

Page 6: Flujos y archivos

PrintWriter, claseprocesamiento de archivosprocesamiento de fl ujosReader, clasereadLine, método de la clase BufferedReaderreadObject, método de la clase ObjectInputStreamreadObject, método de la interfaz ObjectInputregistroregistro de longitud fi jaruta absolutaTerminologíaruta relativasecuencia de comandos de shellSerializable, interfazserialización de objetossetErr, método de la clase SystemsetIn, método de la clase SystemsetOut, método de la clase SystemsetSelectionMode de la clase JFileChoosershowOpenDialog de la clase JFileChoosersistema de administración de bases de datos (DBMS)System.err (fl ujo de error estándar)transient, palabra clavetruncadaUnicode, conjunto de caracteresURI (Identifi cador uniforme de recursos)writeBoolean, método de la interfaz DataOutputwriteByte, método de la interfaz DataOutputwriteBytes, método de la interfaz DataOutputwriteChar, método de la interfaz DataOutputwriteChars, método de la interfaz DataOutputwriteDouble, método de la interfaz DataOutputwriteFloat, método de la interfaz DataOutputwriteInt, método de la interfaz DataOutputwriteLong, método de la interfaz DataOutputwriteObject, método de la clase ObjectOutputStreamwriteObject, método de la interfaz ObjectOutputWriter, clasewriteShort, método de la interfaz DataOutputwriteUTF, método de la interfaz DataOutputSección 14.1 Introducción• Los datos que se almacenan en variables y arreglos son temporales; se pierden cuando una variable local queda fuerade alcance, o cuando el programa termina. Las computadoras utilizan archivos para la retención a largo plazo degrandes cantidades de datos, incluso después de que los programas que crearon los datos terminan de ejecutarse.• Los datos persistentes que se mantienen en archivos existen más allá de la duración de la ejecución del programa.• Las computadoras almacenan los archivos en dispositivos de almacenamiento secundario, como los discos duros.

Page 7: Flujos y archivos

Sección 14.2 Jerarquía de datos• El elemento de datos más pequeño en una computadora puede asumir el valor 0 o 1, y se le conoce como bit. Enúltima instancia, una computadora procesa todos los elementos de datos como combinaciones de ceros y unos.• El conjunto de caracteres de la computadora es el conjunto de todos los caracteres que se utilizan para escribir programasy representar datos.• Los caracteres en Java son Unicode y están compuestos de dos bytes, cada uno de los cuales se compone de ochobits.• Así como los caracteres están compuestos de bits, los campos se componen de caracteres o bytes. Un campo es ungrupo de caracteres o bytes que transmite un signifi cado.• Los elementos de datos procesados por las computadoras forman una jerarquía de datos, la cual se vuelve más grandey compleja en estructura, a medida que progresamos de bits a caracteres, luego a campos, y así en lo sucesivo.• Por lo general, varios campos componen un registro (que se implementa como class en Java).• Un registro es un grupo de campos relacionados.• Un archivo es un grupo de registros relacionados.• Para facilitar la obtención de registros específi cos de un archivo, se elije por lo menos un campo en cada registrocomo clave. Una clave de registro identifi ca que un registro pertenece a una persona o entidad específi ca, y es únicopara cada registro.• Existen muchas formas de organizar los registros en un archivo. La más común se llama archivo secuencial, en el cuallos registros se almacenan en orden, en base al campo clave de registro.• Por lo general, a un grupo de archivos relacionados se le denomina base de datos. Una colección de programasdiseñados para crear y administrar bases de datos se conoce como sistema de administración de bases de datos(DBMS).Sección 14.3 Archivos y fl ujos• Java ve a cada archivo como un fl ujo secuencial de bytes.• Cada sistema operativo cuenta con un mecanismo para determinar el fi n de un archivo, como un marcador de fi nde archivo o la cuenta de los bytes totales en el archivo, que se registra en una estructura de datos administrativa,manejada por el sistema.• Los fl ujos basados en bytes representan datos en formato binario.• Los fl ujos basados en caracteres representan datos como secuencias de caracteres.• Los archivos que se crean usando fl ujos basados en bytes son archivos binarios. Los archivos que se crean usandofl ujos basados en caracteres son archivos de texto. Los archivos de texto se pueden leer mediante editores de texto,

Page 8: Flujos y archivos

mientras que los archivos binarios se leen mediante un programa que convierte esos datos en un formato legible paralos humanos.• Java también puede asociar los fl ujos con distintos dispositivos. Tres objetos fl ujo se asocian con dispositivos cuandoun programa de Java empieza a ejecutarse: System.in, System.out y System.err.• El paquete java.io incluye defi niciones para las clases de fl ujos, como FileInputStream (para la entrada basadaen bytes de un archivo), FileOutputStream (para la salida basada en bytes hacia un archivo), FileReader (para la entradabasada en caracteres de un archivo) y FileWriter (para la salida basada en caracteres hacia un archivo). Losarchivos se abren creando objetos de estas clases de fl ujos.Sección 14.4 La clase File• La clase File se utiliza para obtener información acerca de los archivos y directorios.• Las operaciones de entrada y salida basadas en caracteres se pueden llevar a cabo con las clases Scanner y Formatter.• La clase Formatter permite mostrar datos con formato en la pantalla, o enviarlos a un archivo, de una manerasimilar a System.out.printf.• La ruta de un archivo o directorio especifi ca su ubicación en el disco.• Una ruta absoluta contiene todos los directorios, empezando con el directorio raíz, que conducen hacia un archivoo directorio específi co. Cada archivo o directorio en una unidad de disco tiene el mismo directorio raíz en su ruta.• Por lo general, una ruta relativa empieza desde el directorio en el que se empezó a ejecutar la aplicación.• Un carácter separador se utiliza para separar directorios y archivos en la ruta.Sección 14.5 Archivos de texto de acceso secuencial• Java no impone una estructura en un archivo; las nociones como los registros no existen como parte del lenguaje deJava. El programador debe estructurar los archivos para satisfacer los requerimientos de una aplicación.• Para obtener datos de un archivo en forma secuencial, los programas comúnmente empiezan a leer desde el principiodel archivo y leen todos los datos en forma consecutiva, hasta encontrar la información deseada.• Los datos en muchos archivos secuenciales no se pueden modifi car sin el riesgo de destruir otros datos en el archivo.Por lo tanto, los registros en un archivo de acceso secuencial normalmente no se actualizan directamente en su ubicación.En vez de ello, se vuelve a escribir el archivo completo.Sección 14.6 Serialización de objetos• Java cuenta con un mecanismo llamado serialización de objetos, el cual permite escribir o leer objetos completosmediante un fl ujo.• Un objeto serializado es un objeto que se representa como una secuencia de bytes, e incluye los datos del

Page 9: Flujos y archivos

objeto, así como información acerca del tipo del objeto y los tipos de datos almacenados en el mismo.• Una vez que se escribe un objeto serializado en un archivo, se puede leer del archivo y deserializarse; es decir,se puede utilizar la información de tipo y los bytes que representan al objeto para recrearlo en la memoria.• Las clases ObjectInputStream y ObjectOutputStream, que implementan en forma respectiva a las interfacesObjectInput y ObjectOutput, permiten leer o escribir objetos completos de/a un fl ujo (posiblemente unarchivo).• Sólo las clases que implementan a la interfaz Serializable pueden serializarse y deserializarse con objetosObjectOutputStream y ObjectInputStream.Sección 14.7 Clases adicionales de java.io• La interfaz ObjectOutput contiene el método writeObject, el cual recibe un objeto Object que implementa a lainterfaz Serializable como argumento y escribe su información en un objeto OutputStream.• La interfaz ObjectInput contiene el método readObject, que lee y devuelve una referencia a un objeto Objectde un objeto InputStream. Una vez que se ha leído un objeto, su referencia puede convertirse al tipo actual delobjeto.• El uso de búfer es una técnica para mejorar el rendimiento de E/S. Con un objeto BufferedOutputStream, cadainstrucción de salida no necesariamente produce una transferencia física real de datos al dispositivo de salida. En vezde ello, cada operación de salida se dirige hacia una región en memoria llamada búfer, la cual es lo bastante grandecomo para contener los datos de muchas operaciones de salida. La transferencia actual al dispositivo de salida serealiza entonces en una sola operación de salida física extensa cada vez que se llena el búfer.• Con un objeto BufferedInputStream, muchos trozos “lógicos” de datos de un archivo se leen como una sola operaciónde entrada física extensa y se colocan en un búfer de memoria. A medida que un programa solicita cada nuevotrozo de datos, se obtiene del búfer. Cuando el búfer está vacío, se lleva a cabo la siguiente operación de entrada físicareal desde el dispositivo de entrada, para leer el nuevo grupo de trozos “lógicos” de datos.Resumen 645646 Capítulo 14 Archivos y fl ujosSección 14.8 Abrir archivos con JFileChooser• La clase JFileChooser se utiliza para mostrar un cuadro de diálogo, que permite a los usuarios de un programaseleccionar archivos con facilidad, mediante una GUI.aplicación de acceso directoapuntador de posición de archivo

Page 10: Flujos y archivos

archivoarchivo binarioarchivo de acceso secuencialarchivo de procesamiento por lotesarchivo de sólo lecturaarchivo de textoarchivos de acceso directoarreglo de bytes envueltobase de datosbit (dígito binario)búferbúfer de memoriabyte, tipo de datoscampoCANCEL_OPTION, constante de la clase JFileChoosercanRead, método de la clase FilecanWrite, método de la clase Filecapacidad-classpath, argumento de línea de comandos para java-classpath, argumento de línea de comandos parajavacclave de registroconjunto de caracteresconjunto de caracteres ASCII (Código estándar estadounidensepara el intercambio de información)DataInput, interfazDataInputStream, claseDataOutput, interfazDataOutputStream, clasedatos persistentesdígito decimalDIRECTORIES_ONLY, constante de la clase JFileChooserdirectoriodirectorio padredirectorio raízdiscodisco ópticodispositivos de almacenamiento secundarioEndOfFileException, excepciónenvoltura de objetos fl ujoexists, método de la clase Fileexit, método de la clase SystemFile, claseFileInputStream, claseFileOutputStream, claseFileReader, claseFILES_AND_DIRECTORIES, constante de la clase JFile-ChooserFILES_ONLY, constante de la clase JFileChooserFileWriter, clase

Page 11: Flujos y archivos

fl ujo basado en bytesfl ujo basado en caracteresfl ujo de bytesFormatter, clasegetAbsolutePath, método de la clase FilegetName, método de la clase FilegetParent, método de la clase FilegetPath, método de la clase FilegetSelectedFile, método de la clase JFileChooserInputStream, claseinterfaz de marcadoIOException, excepciónisAbsolute, método de la clase FileisDirectory, método de la clase FileisFile, método de la clase Filejava.io, paquetejerarquía de datosJFileChooser, claseJFileChooser, cuadro de diálogolastModified, método de la clase Filelength, método de la clase Filelist, método de la clase Filemarcador de fi n de archivonombre de directorioNoSuchElementException, excepciónObjectInputStream, claseObjectOutputStream, claseobjeto deserializadoobjeto fl ujoobjeto fl ujo de error estándarobjeto serializadooperación física de entradaoperación física de salidaoperaciones lógicas de entradaoperaciones lógicas de salidaOutputStream, clasepathSeparator, campo static de la clase FilePrintStream, clasePrintWriter, claseprocesamiento de archivosprocesamiento de fl ujosReader, clasereadLine, método de la clase BufferedReaderreadObject, método de la clase ObjectInputStreamreadObject, método de la interfaz ObjectInputregistroregistro de longitud fi jaruta absolutaTerminologíaruta relativa

Page 12: Flujos y archivos

secuencia de comandos de shellSerializable, interfazserialización de objetossetErr, método de la clase SystemsetIn, método de la clase SystemsetOut, método de la clase SystemsetSelectionMode de la clase JFileChoosershowOpenDialog de la clase JFileChoosersistema de administración de bases de datos (DBMS)System.err (fl ujo de error estándar)transient, palabra clavetruncadaUnicode, conjunto de caracteresURI (Identifi cador uniforme de recursos)writeBoolean, método de la interfaz DataOutputwriteByte, método de la interfaz DataOutputwriteBytes, método de la interfaz DataOutputwriteChar, método de la interfaz DataOutputwriteChars, método de la interfaz DataOutputwriteDouble, método de la interfaz DataOutputwriteFloat, método de la interfaz DataOutputwriteInt, método de la interfaz DataOutputwriteLong, método de la interfaz DataOutputwriteObject, método de la clase ObjectOutputStreamwriteObject, método de la interfaz ObjectOutputWriter, clasewriteShort, método de la interfaz DataOutputwriteUTF, método de la interfaz DataOutput