viernes, 18 de diciembre de 2015

Arreglo Unidimensional en Java

Arreglo de una Dimensión o Vector

Alexis Romero Mendoza

¿Qué es un arreglo en programación?
En una colección de datos del mismo tipo. Sirve para manejar un numero n de elementos en común, ya sea de tipos definidos por el lenguaje de programación (int, float, String, etc.), o definidos por el programador. 

¿Qué es un arreglo unidimensional o vector?
Es un tipo de datos estructurados. Esta formado por una colección finita y ordenada de datos el mismo tipo. Se accede al los elementos del vector de manera directa, es decir, podemos acceder a cualquier elemento sin tener que consultar elementos anteriores o posteriores, esto se logra mediante el uso de un indice para cada elemento del arreglo que nos da su posición.

Características principales de un arreglo unidimensional o vector.
  1. Almacena los elementos en posiciones de memoria continua. 
  2. Tienen solo nombre variable que representa a todos los elementos, y estos a su vez se identifican por un índice o subíndice. 
Sintaxis.

[ ] nombre_arreglo;
nombre_arreglo = new [tamaño];

//En la primera linea declaramos el arreglo.
//en la segunda linea instanciamos el arreglo, y le asignamos un tamaño**

**tamaño: número máximo de elementos a almacenar.

Ejemplo en Java.

1 import java.util.Scanner;
2
3 /**
4 *
5 * @author Alexis
6 */
7 public class Arreglo {
8    public static void main(String[] args) {
9        Scanner lector = new Scanner(System.in);
10        
11        String arreglo  [] = new String[5]; 
12        //Aquí declaras el arreglo y el tamaño
13        for(int i=0;i<5;i++){
14        System.out.print("Ingrese el nombre del alumno "+i+" : ");
15        arreglo[i] = lector.next();
16        //Aquí lees los datos y los almacenas en el 16 arreglo.           
17        }        
18        //Aquí mostramos los elementos guardados en el arreglo.
19        System.out.print("Los elementos en el arreglo son: ");
20        for(int j=0;j<5;j++){
21        System.out.print("\n"+arreglo[j]);
22        }
23    }
24    
25 }

Linea 9: Se crea un objeto llamado "lector" de tipo Scanner, lo usamos para leer los datos que se ingresen desde la consola.
Linea 11: Se declara el arreglo, le asignamos un nombre y su tamaño máximo de elementos.
Linea 13: Usamos un ciclo for para mostrar al usuario el mismo mensaje de acuerdo al tamaño del vector. Lo que se mostrará 5 veces es "ingrese el nombre del alumno", es porque el tamaño del vector es de, y por lo tanto se tendrán que almacenar 5 elementos como máximo. Ejemplo en tiempo de ejecución: 

13        for(int i=0;i<5;i++){
14        System.out.print("Ingrese el nombre del alumno "+i+" : ");
15        arreglo[i] = lector.next();

Esto es lo que mostrará en la consola el ciclo for de aquí arriba:
Consola
--------------------------------------------------------------------
Ingrese el nombre del alumno 0 :
Ingrese el nombre del alumno 1 :
Ingrese el nombre del alumno 2 :
Ingrese el nombre del alumno 3 :
Ingrese el nombre del alumno 4 :

Fin de la ejecución.
--------------------------------------------------------------------
Obviamente el usuario debe ingresar datos a la hora que se solicitan, veamos un ejemplo...

Consola
--------------------------------------------------------------------
Ingrese el nombre del alumno 0 : Alexis
Ingrese el nombre del alumno 1 : Itzel
Ingrese el nombre del alumno 2 : Rodrigo
Ingrese el nombre del alumno 3 : José
Ingrese el nombre del alumno 4 : Juan 

Fin de la ejecución.
--------------------------------------------------------------------
En este caso el usuario ha ingresado el nombre de los alumnos.

El siguiente bloque de código en nuestro programa es otro ciclo for, pero en esta situación lo usamos para mostrar los elementos almacenados dentro del vector.

19        System.out.print("Los elementos en el arreglo son: ");
20        for(int j=0;j<5;j++){
21        System.out.print("\n"+arreglo[j]);
22        }

Ejecutamos el programa completo, esta vez ingresaremos los datos que nos piden...
Consola
--------------------------------------------------------------------
Ingrese el nombre del alumno 0 : Alexis
Ingrese el nombre del alumno 1 : Itzel
Ingrese el nombre del alumno 2 : Rodrigo
Ingrese el nombre del alumno 3 : José
Ingrese el nombre del alumno 4 : Juan 

Los elementos en el arreglo son:
Alexis
Itzel
Rodrigo
José
Juan

Fin de la ejecución.
--------------------------------------------------------------------
Con esto terminaría la ejecución del programa correctamente.

Aquí abajo les dejo el archivo .java para que se lo descarguen desde Dropbox...


viernes, 9 de octubre de 2015

Dispositivos entrada y salida de la computadora

Elaboró: Alexis Romero Mendoza

Arquitectura de computadoras

En esta entrada se hablara el tema de Dispositivos de Entrada/Salida (Input/Output), un tema muy interesante derivado de Arquitectura de Computadoras. Cabe mencionar que me he basado del libro "ARQUITECTURA DE COMPUTADORAS, De los microprocesadores a las supercomputadoras" del autor Behrooz Parhami.  

Resumen...

Dispositivos y controladores de entrada/salida

El procesador y la memoria son muchos más rápidas que la mayoría de los dispositivos I/O; mientras más cerca este una unidad al CPU, más rápido se accede a ella.

Las señales electrónicas viajan casi a la mitad de la rapidez de la luz, s este retardo de propagación de señal de viaje redondo de 2 ns, se le deben sumar varios retardos lógicos, como el tiempo de espera del buffer, retardo de arbitraje de bus y la latencia de acceso a la memoria.

Hay que tomar en cuenta que muchos dispositivos I/O también son más lentos según su naturaleza electromecánica.

Los dispositivos I/O se pueden categorizar con base en sus características, tales como:
     1)    El medio que se usa para la presentación de datos (copia impresa, electrónica)
     2) La medida de involucramiento humano (manual, automática)
     3)    Calidad d producción (bosquejo preliminar, calidad de publicación o fotografía)

Los modernos dispositivos I/O soy muy inteligentes, debido a que contienen su propio CPU (procesador de propósito general de bajo perfil), memoria y capacidades de comunicación, que cada vez más incluyen conectividad de red.

Las interfaces con tales dispositivos, pueden tener muchos MB de memoria de buffer, y son de control muy diferente de los primeros dispositivos I/O, que se alimentaban con información, o dirigirse para enviar datos, un byte a la vez.

Los dispositivos se comunican con el CPU y la memoria mediante un controlador I/O conectados a un bus compartido. Los sistemas simples  de bajo perfil pueden usar el mismo bus para I/O que se usa para enviar datos de ida y vuelta entre el CPU y la memoria.

Los sistemas de alto rendimiento pueden tener un bus  I/O separado para garantizar que no se quita ancho de banda de las transferencias CPU-memoria. Cuando existen múltiples bases en un sistema, se ponen en interfaz mutua a través  de  adaptadores de bus.

*AGP (puerto grafico acelerado), es un puerto compartido, no un bus.
Los controladores I/O son computadoras por derecho propio. Cuando se activan, corren programas especiales para guiarlos a través de las operaciones requeridas de transferencia de datos y protocolos asociados.

Teclado y ratón
Un teclado consiste en un arreglo de teclas que se usa para ingresar información a la computadora u otro dispositivo digital. Los teclados pequeños como el de un teléfono, o en un área separada en muchas computadoras se les conocen como Keypad.

Casi todos los teclados alfanuméricos siguen la plantilla QWERTY.
La plantilla QWERTY se eligió para reducir deliberadamente la rapidez de tecleo con intención de evitar el atasco de los martillos mecánicos de las primeras máquinas de escribir.
Se ha progresado algo en el área de colocación de teclas no convencionales para dar al usuario comodidad con el tecleo. Los teclados que siguen tales diseños se denominan teclados ergonómicos.

Diseños específicos de las teclas:
      1)  Los interruptores de membrana  se usan en aplicaciones de sistemas incrustados)
      2)Los interruptores mecánicos (se usan en teclados de escritorio estándar)

Puesto que los contactos se pueden ensuciar con el paso del tiempo, otros tipos de interruptores se apoyan en la fuerza inducida de forma magnética para cerrar un par de contactos.
Sin importar la plantilla física,  las teclas de un teclado con frecuencia se ordenan en un arreglo bidimensional desde un punto de vista lógico. Cada tecla esta en la intersección de un circuito de hilera y columna.

Presionar una tecla  provoca cambios eléctricos en los circuitos de hilera y columna asociados con la tecla, ellos permite la identificación de la tecla que se presionó. Entonces, un  codificador convierte las identidades en un código de símbolo (usualmente ASCII) para que se transmitan a la computadora.

Además de un teclado, la mayoría de las computadoras de escritorio y laptop tiene dispositivos apuntadores que permiten al usuario elegir una variedad de operaciones. Este dispositivo apuntador es llamado ratón

Diseños de ratones: 
         1) En un ratón  mecánico, dos contadores se asocian con los rodillos x y y.

          2) Ratón óptico, es más preciso y menos proclives a fallos debido al polvo que se acumule. Algunos tienen cámaras digitales que les permiten detectar movimiento sobre cualquier superficie.

          3)  Touchpad, sustituye con frecuencia a un ratón  para aplicaciones  en las laptops, aquí la ubicación de un dedo se percibe cuando toca el tapete, y le movimiento del cursor se determina según cuán lejos, rápido y en qué dirección se movió el dedo.

La pantalla táctil es similar al touchpad pero en lugar de un tapete separado, la superficie de la pantalla se usa para apuntar.
En la actualidad los teclados y dispositivos con frecuencia tienen procesadores dedicados (microcontroladores) interconstruidos.

Unidades de presentación visual
 La representación visual  de símbolos e imágenes es el método de salida primario para la mayoría  de las computadoras. Las opciones disponibles varían desde pequeñas pantallas monocromas (de los tipos utilizados en celulares) hasta los grandes dispositivos  de presentación de alta resolución.

Hasta hace poco tiempo los tubos de rayos catódicos (CRT) eran el principal dispositivo de presentación visual. Y las pantallas de panel plano se reservaban para su uso en dispositivos digitales portátiles.

Las pantallas CRT funcionan mediante un haz de electrones que barre la superficie de una pantalla sensible, y crea un pixel oscuro o claro, conforme pasa cada punto.

La tecnología del CRT pasó por varias etapas:
     1)  Los primeros intentos usaron un CRT monocromático que se veía mediante la rotación de filtros de color  mientras se desplegaban a las ves pixeles asociados  con varios colores.

          2) Los CRT modernos se basaban el método tricolor RGB (rojo, verde, azul). Los tres haces de electrones separados exploran la superficie de la pantalla, cada uno cada uno llega en ángulo ligeramente diferente. Y una máscara de sombre que representa  una placa metálica con aberturas, fuerza a cada haz a impactar solo tiras de fosforo de un color particular, la separación de dos tiras consecutivas del mismo color, dicta la resolución de la imagen resultante.
Físicamente las pantallas CRT son voluminosas, requieren alto consumo de energía y generan gran cantidad de calor, la imagen sufre distorsión, así como de foco y color no uniformes.

Las pantallas de cristal líquido en panel (LCD) son muy populares.
Otras tecnologías de pantalla de panel plano incluyen las que se basan en diodos emisores de luz (LED) y el fenómeno de plasma. Las pantallas LED consisten de arreglos de LED de uno o más colores, y cada LED se direcciona a través de un índice  de hilera y columna.
La operación de las pantallas de plasma es similar a la de una lámpara de neón. Explotan la propiedad de ciertas  mezclas  de gases que se descomponen en plasma cuando se sujetan a un campo eléctrico muy intenso, el plasma conduce la electricidad  y convierte una parte de la energía eléctrica en luz visible.
Muchas computadoras ofrecen salida compatible con el formato de presentación de salida en televisión, ello permite que cualquier que cualquier TV actué como unidad de presentación. La misma señal compatible con TV se puede proporcionar a un proyector de video que produce una réplica de la imagen en el CRT o unidad de pantalla de panel plano de la computadora en una pantalla del tamaño de una pared.

Dispositivos de entrada/salida de copia impresa
La entrada de copia impresa se acepta a través de escáneres (digitalizadores). Un digitalizador  funciona  como una unidad de pantalla CRT, pero en dirección contraria.
Un escáner percibe el color y la intensidad y los convierte en señales electrónicas conforme recorre una imagen línea por línea, esta información se almacena en memoria en uno de muchos formatos estándar.

Los escáneres se caracterizan por resolución espacial expresada en pixeles y fidelidad de color. En relación con el tipo de documentos tales dispositivos se dividen en:

       1)Escáner de cama plana, tienen la ventaja de no provocar daño al documento original debido al doblado, y permiten la digitalización de libros.

       2)  Escáner de cabeza y portátiles pueden digitalizar documentos grandes sin ser voluminosos o costosos.

Para el caso del texto digitalizado, la imagen se puede convertir en forma simbólica a través de software de reconocimiento de caracteres (OCR) y se almacena en archivo de texto, y se usa para poner en línea libros antiguos. El reconocimiento de la escritura manual se ha vuelto más importante debido a la proliferación de las aplicaciones de los asistentes digitales personales (PDA) y las computadoras portátiles sin teclado.

La impresora; las primeras impresoras para computadora funcionaban en forma parecida a las antiguas máquinas de escribir, usaban  dispositivos de formación de caracteres que golpeaban sobre una banda de tela o plástico mediante un mecanismo parecido a un martillo.

Las impresoras modernas imprimen una gran imagen en matriz de punto de la página que está compuesta de archivos de texto o gráfico. La impresora de inyección de tinta, lenta y barata, imprimen los puntos uno o pocos a la vez. Las gotas de tinta se expulsan desde la cabeza de impresión mediante varios mecanismos como calentamiento o generación de ondas de choque.

La impresora láser, grande y rápida. Forman una copia de la imagen a imprimir en la forma de patrones de carga eléctrica en un tambor rotatorio e imprimen toda la página a alta rapidez.
Al igual que un escáner, una impresora de matriz de punto se caracteriza por su resolución espacial, (en pixeles y número de color).

Las impresoras de blanco y negro depositan gotas de tinta o funden partículas de tóner en el papel de acuerdo a los requisitos del documento.

Los colores que se usan en las impresoras son cian (azul-verde) magenta y amarillo, que forman el esquema CMY, que representa la ausencia de los colores RGB. El esquema CMY es sustractivo y forma un color deseado al remover los componentes adecuados de la luz blanca. La mayoría de la impresoras usan el esquema CMYK (K=negro).

Una máquina que combina escáner/impresora puede ofrecer capacidades de transmisión de fax y fotocopiado con poco hardware adicional.

Otros dispositivos de entrada/salida
Una cámara digital fija o de video captura imágenes para ingresar a una computadora en forma muy similar a un escáner. La luz entrante proveniente del exterior de la cámara se convierte en pixeles y se almacena en memoria flash o algún otro medio de almacenamiento no volátil.

La entrada de audio se captura mediante micrófonos, las computadoras contienen una tarjeta sonora que puede capturar sonidos mediante un puerto de micrófono. Para almacenar en una computadora, el sonido se digitaliza al tomar muestras de la forma ondulatoria a intervalos regulares. La fidelidad del sonido se mejora al aumentar la tasa de muestreo al usar más bits para representar cada muestra.

Es frecuente el uso de sensores para proporcionar información acerca del ambiente y otras condiciones de interés para las computadoras.
         1) Las fotoceldas constituyen sensores de luz más simples para controlar luces nocturnas, semáforos, cámaras y juguetes.

             2)    Los sensores de temperatura, que se basa en la medición de la variación de las propiedades del material (como resistencia eléctrica) con la temperatura.

             3)  Los detectores de presión convierten la deformación o alargamiento en materiales a cambios en algunas propiedades eléctricas.

La salida de imagen mediante computadoras se produce al renderizar varios dispositivos de presentación visual o imprimir/graficar papel. Las imágenes se pueden transferir directamente a microfilme para archivar o proyectar en una pantalla durante presentaciones audiovisuales.
La salida de audio se produce a partir de archivos de audio, y la tarjeta de sonido convierte archivos almacenados posiblemente comprimidos en ondas eléctricas adecuadas para enviar a una o más bocinas.

Redes de dispositivos de entada/salida
Entrada y salida involucran transferencias de archivos mediante una red. Los dispositivos periféricos basados en red permiten compartir recursos inusuales o rara vez usados

Las I/O en red también ofrecen flexibilidad en la colocación de dispositivos I/O de acuerdo con necesidades dinámicamente cambiantes y permiten la actualización o sustitución, mientras que reduce el cableado y los problemas de conectividad.



Si no has quedado satisfecho con la información brindada puedes consultar el libro de manera directa, y sacar al máximo los recursos en los que tengas interés. Aqui abajo les dejo el link de Dropbox para consultar material de utilidad sobre el tema principal de Arquitectura de Computadoras.









Manejo de archivos en Java y C#

Elaboró: Alexis Romero Mendoza


Manejo de Archivos en los lenguajes de programación de alto nivel: Java y C#

Introducción

Las computadoras utilizan archivos para la retención a largo plazo de grandes cantidades de datos. Las personas utilizamos a diario archivos, en tareas como ensayos, hojas de cálculo, etc.

Sabemos que el almacenamiento de datos en variables o arreglos es temporal, pues se pierden generalmente cuando termina el programa. Nos vamos a referir a los datos que se mantienen en archivos como datos persistentes, ya que 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 discos duros, discos ópticos, etc.

El procesamiento de archivos es una herramienta muy importante con la que debe de contar un lenguaje de programación para que pueda soportar aplicaciones comerciales que procesan cantidades masivas de datos persistentes.

Una computadora  procesa todo los elementos de datos como combinaciones de ceros y unos, los circuitos de las maquinas realizan varias manipulaciones simples de bits. Lo anterior resulta muy difícil, en vez de ello los programadores prefieren trabajar con datos en formatos como dígitos decimales. Los dígitos, letras y símbolos especiales se conocen como caracteres, el conjunto de caracteres de la computadora es el conjunto de todos los caracteres utilizados para escribir programas y representar elementos de datos. Las computadoras pueden  procesar  solamente 1s y 0s, un conjunto de caracteres ésta compuesto de bits, los campos están compuestos de caracteres o bytes, un campo es un grupo de caracteres o bytes que transmiten cierto significado, varios campos forman un registro, un archivo es un grupo de registros relacionados, un archivo puede verse como una colección de bytes.

Se hablara en esta investigación sobre el procesamiento de archivos (leer y escribir) mediante los lenguajes de programación Java y C#.


 1.-Manejo de archivos en Java

Java considera a cada archivo como un flujo secuencial de bytes.

1.1.-Archivos y flujos
Los flujos de archivos se pueden utilizar para la entrada y salida de datos, ya sea como caracteres o bytes. Los flujos que reciben y envían bytes a archivos se conocen como flujos basados en bytes, y almacenan datos en su formato binario. Los flujos que reciben y envían caracteres de/a los archivos se conocen como flujos basados en caracteres, y almacenan datos como una secuencia de caracteres.

Los archivos que se crean usando flujos basados en bytes se conocen como archivos binarios, mientras que los archivos que se crean usando flujos basados en caracteres se conocen como archivos de texto. Los archivos de texto se pueden leer con editores de texto, mientras que los archivos binarios se leen mediante un programa que convierte los datos en un formato que pueden leer los humanos.

Un programa de Java abre un archivo creando un objeto y asociándole un flujo de bytes o de caracteres. Los programas de Java realizan el procesamiento de archivos utilizando clases del paquete java.io. Este paquete incluye definiciones para las clases de flujo como FileInputStream (para la entrada basada en bytes desde un archivo), FileOutputStream (para la salida basada en bytes hacia un archivo), FileReader (para la entrada basada en caracteres desde un archivo) y FileWriter (para la salida basada en caracteres hacia un archivo). Los archivos se abren creando objetos de estas clases de flujos, que heredan de las clases InputStream, OutputStream, Reader y Writer.

La clase Scanner se utiliza en forma extensa para recibir datos del teclado. Como veremos, esta clase también puede leer datos de un archivo. La clase Formatter permite mostrar datos con formato en la pantalla, o enviarlos a un archivo, en forma similar a System.out.printf.

1.2.-La clase File

Los objetos de la clase File no abren archivos ni proporcionan herramientas para procesarlos. No obstante, los objetos File se utilizan frecuentemente con objetos de otras clases de java.io para especificar los archivos o directorios que van a manipularse.

Creación de objetos File
La clase File proporciona cuatro constructores.
1   1)   El constructor: public File( String nombre )
Especifica el nombre de un archivo o directorio que se asociará con el objeto File. El nombre puede contener información sobre la ruta, así como el nombre de un archivo o directorio.

2        2)  El constructor: public File( String rutaAlNombre, String nombre )
Usa el argumento rutaAlNombre (una ruta absoluta o relativa) para localizar el archivo o directorio especificado por nombre.

3       3)  El constructor: public File( File directorio, String nombre )
Usa un objeto File existente llamado directorio (una ruta absoluta o relativa) para localizar el archivo o directorio especificado por nombre.

      4) El constructor: public File( URI uri )
Usa el objeto URI dado para localizar el archivo. Un Identificador uniforme de recursos (URI) es una forma más general de un Localizador uniforme de recursos (URL), el cual se utiliza comúnmente para localizar sitios Web.

Puede utilizar la clase File para determinar muchas cosas sobre archivos, como su tamaño, si se puede escribir sobre ellos, si un elemento es un archivo, directorio o conexión de nombres,   más aún. Se puede utilizar isFile para determinar si un elemento es un archivo verdadero u otra cosa, como un directorio (lo puede comprobar con isDirectory) o una conexión de nombres. Utilice toURL para convertir la vía de acceso de un archivo a un URL, renombrar archivos y otros con la clase File.

Se puede utilizar uno de los siguientes métodos para reunir información sobre el archivo:
1)      Nombres de archivo:
    String getName()
  String getPath()
  String getAbsolutePath()
  String getParent()
  boolean renameTo( File nuevoNombre )



2)      Comprobaciones:
boolean exists()
boolean canWrite()
boolean canRead()
boolean isFile()
boolean isDirectory()
boolean isAbsolute()


3)     Información general del archivo:
long lastModified()
long length()

4)      Utilidades de directorio:
 boolean mkdir()
 String[] list()


1.3. - Las clases FIleInputStream y FileOutputStream

Gran parte de la entrada y salida de los programas se realiza basándose en archivos y para ello java.io aporta dos clases. Una para archivos de entrada, FileInputStream, y otra para archivos de salida, FileOutputStream. La diferencia entre archivos de entrada y de salida es fundamental, pues situaciones como intentar leer de un archivo de salida o viceversa pueden generar en errores.

1.2.1.-Apertura de un FileInputStream

Para abrir un FileInputStream sobre un archivo, se le da al constructor un String o un objeto File: El ejemplo siguiente crea dos FileInputStreams que están utilizando el mismo archivo de disco real. Cualquiera de los dos constructores disponibles en esta clase puede lanzar una FileNotFoundException.

InputStream f1 = new FileInputStream("/archivo.txt");
File f = new file("/archive.txt");
InputStream f2 = new FileInputStream(f);
FileInputStream fichero=new FileInputStream("/carpeta/archive.txt");
File fichero = new File( "/carpeta/archive.txt" );
FileInputStream ficheroSt= new FileInputStream( fichero );

Aunque probablemente el primer constructor es el que más se utiliza habitualmente, el segundo permite examinar el archivo más de cerca utilizando sus métodos antes de asignarlo a un flujo de entrada. Cuando se crea un FileInputStream, también se abre para lectura. FileInputStream sobrescribe seis de los métodos de la clase abstracta InputStream. Si se intentan utilizar los métodos mark o reset en un FileInputStream se generará una IOException.


1.2.2.-Lectura de un FileInputStream

Una vez abierto el FileInputStream, se puede leer de él. El método read() tiene muchas opciones:

1)      int read();
      Lee un byte y devuelve -1 al final del stream.

2)      int read( byte b[] );
Llena todo el array, si es posible. Devuelve el número de bytes leídos o -1 si se alcanzó el final del stream.

3)      int read( byte b[],int offset,int longitud );
Lee longitud bytes en b comenzando por b[offset]. Devuelve el número de bytes   leídos o -1 si se alcanzó el final del stream.

1.2.3.-Cierre de FileInputStream

Cuando se termina con un archivo, existen dos opciones para cerrarlo: explícitamente, o implícitamente cuando se recicla el objeto (el garbage collector se encarga de ello).

Para cerrarlo explícitamente, se utiliza el método close():
 miArchivoSt.close();

1.2.4.-Apertura de un FileOutputStream

Para abrir un objeto FileOutputStream, se tienen las mismas posibilidades que para abrir un archivo stream de entrada. Se le da al constructor un String o un objeto File.

FileOutputStream miArchivoSt;
miArchivoSt = new FileOutputStream( "/etc/kk" );

Como con los streams de entrada, también se puede utilizar:

File miArchivo FileOutputStream miArchivoSt;
miArchivo = new File( "/etc/kk" );
miArchivoSt = new FileOutputStream( miArchivo ); 


1.2.5.-Escritura en un FileOutputStream

Una vez abierto el archivo, se pueden escribir bytes de datos utilizando el método write().
Como con el método read() de los streams de entrada, tenemos tres posibilidades:

void write( int b );//Escribe un byte.

void write( byte b[] );//Escribe todo el array, si es posible.

void write( byte b[],int offset,int longitud );//Escribe longitud bytes en b comenzando por b[offset]

1.2.6.-Cierre de FileOutputStream

Cerrar un stream de salida es similar a cerrar streams de entrada. Se puede utilizar el método explícito: miArchivoSt.close();
O, se puede dejar que el sistema cierre el archivo cuando se recicle miArchivoSt.

2.-Manejo de archivos en C#


La manera de almacenar y recuperar información que perdure en el tiempo se basa en el uso de “memoria secundaria”, compuesta esencialmente por discos (diskettes, discos duros, CD, DVD, etc.) y ocasionalmente cintas. En cualquiera de estos medios, la unidad de almacenamiento de información se denomina archivo.

2.1.-Streams

La lectura y escritura a un archivo son hechas usando un concepto genérico llamado stream. La idea detrás del stream existe hace tiempo, cuando los datos son pensados como una transferencia de un punto a otro, es decir, como un flujo de datos. En el ambiente .NET se puede encontrar muchas clases que representan este concepto que trabaja con archivos o con datos de memoria.


Un stream es como se denomina a un objeto utilizado para transferir datos. Estos datos pueden ser transferidos en dos posibles direcciones:

1)       Si los datos son transferidos desde una fuente externa al programa, entonces se habla de “leer desde el stream”.

2)    Si los datos son transferidos desde el programa a alguna fuente externa, entonces se habla de “escribir al stream”.

Frecuentemente, la fuente externa será un archivo, pero eso no necesariamente es el caso, por lo que el concepto es utilizado ampliamente con fuentes de información externas de diversos tipos.

-Leer o escribir datos a una red utilizando algún protocolo de red, donde la intención es que estos datos sean recibidos o enviados por otro computador.

 -Lectura o escritura a un área de memoria., otros.

Algunas clases que C# provee para resolver este acceso a fuentes diversas incluyen las clases de tipo: Reader y Writer.

2.1.1.-BufferedStream

Esta clase se utiliza para leer y para escribir a otro stream. El uso de streams para la lectura y escritura de archivo es directa pero lenta. Para operaciones de archivo es posible utilizar FileStream, donde el buffering está ya incluido.

Las clases más relacionadas con la escritura y lectura de archivos (File Input/Output o File I/O) son:

1) FileStream, cuyo propósito es lectura y escritura de datos binarios (no de texto legible), a cualquier archivo de tipo binario, aunque se puede utilizar para acceder a cualquier tipo de archivo, inclusive los de texto.

2) StreamReader y StreamWriter, las cuales están diseñadas para lectura y escritura de archivos de texto. Estas clases se asumen como de un nivel más alto que FileStream.

En la declaración de nombres/rutas de archivos en C#. Se utiliza una sintaxis particular, anteponiendo el símbolo ‘@’ antes del string con la ruta del archivo. Es decir:

string rutaarchivo = @”C:\Temp\archivo.txt”;

2.2.-Using System.IO

Para el uso de estas clases, es necesario referenciar el uso del namespace System.IO, ya que System no contiene los elementos para el manejo de archivos. Por ello, los programas con acceso a archivos deben incluir la línea:

using System.IO;

2.2.1.-Constructor de StreamReader

El más simple de los constructores toma sólo el nombre/ruta del archivo a abrir para lectura:

StreamReader ob = new StreamReader(@”C:\Temp\archivo.txt”);

El constructor deja abierto el stream para poder recuperar la información del archivo desde la instancia de StreamReader declarada. Para cerrar un stream o archivo, se invoca el método Close():

ob.Close();

2.2.2.-Lectura con StreamReader

Son básicamente tres los métodos propios de StreamReader que permiten efectuar lectura desde el stream (archivo) declarado.

1)  ReadLine()
Al igual que el conocido Console.ReadLine(), este método lee una línea completa de un archivo de texto hasta el cambio de línea más próximo. Al igual que su equivalente de consola, StreamReader.ReadLine() no incluye en el string el carácter de cambio de línea.

string linea = ob.ReadLine()

2)  ReadToEnd()
Este método, por su parte, se encarga de acumular la información que hay desde la lectura anterior (que pudo haberse hecho con ReadLine(), por ejemplo) hasta el final del archivo, todo en el mismo string.

string linea = ob.ReadToEnd()

3)  Read ()
Finalmente, el método simple Read() se encarga de leer un caracter a la vez, lo que permite procesar símbolo por símbolo el contenido del archivo. Convenientemente, este método reconoce el cambio de línea y se lo salta como si no existiese. Cuando se encuentra con el fin de archivo, retorna un valor –1, considerando que su retorno es siempre un int (y no un char).

int SigCaracter = ob.Read();

Este mismo método ofrece una declaración alternativa (sobrecarga), donde es posible leer una cantidad específica de caracteres y almacenarlos en un arreglo de enteros.

char[] CharArray = new char[100];
int[] nChars = ob.Read(CharArray, 0, 100);

nChars es un arreglo con los enteros retornados por el método, y será menor si es que la cantidad de caracteres que quedan en el archivo es menor de 100.

2.2.3.- Escritura con StreamWriter

Esta clase funciona prácticamente de la misma manera que StreamReader, excepto que su propósito es únicamente para escribir dentro de un archivo (u otro stream). Es relevante distinguir que en este caso, el proceso de apertura para escritura considera que:

1)      Si el archivo no existe lo crea vacío para comenzar a escribir.
2)      Si el archivo ya existe, lo deja vacío para comenzar a escribir.
3)  Si el archivo ya existe, es posible abrirlo en forma “Append” (agregar) para escribir al final.

2.2.4.-Constructor de StreamWriter
El más simple de los constructores toma sólo el nombre/ruta del archivo a abrir para escritura.

StreamWriter sw = new StreamWriter (@”C:\Temp\archivo.txt”);

De la misma manera que en el caso de la lectura, para cerrar un stream o archivo, se invoca el método Close():

ob.Close();

2.2.5.- Escritura con StreamWriter

Son básicamente dos los métodos propios de StreamWriter que permiten escribir hacia el stream (archivo) declarado y son los mismos que se usan para escribir en la consola: Write() y WriteLine().






1)  WriteLine()
Totalmente equivalente a Console.WriteLine(), se utiliza la misma idea, y el mismo formato, sabiendo que se estará escribiendo el texto no a la consola, sino que al stream abierto con el constructor.

string linea = “Texto de prueba”;
ob.WriteLine(linea);
ob.WriteLine(“Los valores posibles son: {0} y {1}”, 3, 5);

2)  Write ()
También presente, el método simple Write(), permite escribir texto en el stream, de la misma forma que su equivalente método de la clase Console. En este caso se reconocen las siguientes alternativas de uso:

Imprimir un string:
string linea = “Texto de prueba”;
ob.Write(linea);

Imprimir un carácter:
char caracter = ‘T’;
ob.Write(caracter);

Imprimir un arreglo de caracteres:
char[] caracteres = new char[100];
for(int i=0; i<100; i++) caracteres[i] = ‘+‘;
ob.Write(caracteres);

Imprimir una porción de un arreglo de caracteres:
char[] caracteres = new char[100];
for(int i=0; i<100; i++) caracteres[i] = ‘+‘;
ob.Write(caracteres, 25, 50);
// Desde posición 25 se escriben 50 caracteres