About this entry
You’re currently reading the article “Usando Clases en Java (Class Usage in Java, Spanish only).”
- Published:
- December 26th 04:57 PM
- Updated:
- June 11th 05:46 AM
- Sections:
- Tutorial de Java
Usando Clases en Java (Class Usage in Java, Spanish only)
Hay un número muy limitado de objetos predefinidos de Java como el System.out y las hileras constantes. Para alcanzar cualquier cosa útil necesitamos crear objetos nosotros mismos. Este artículo explica los fundamentos de la creación y uso de objetos en Java.
Liked it? !
Antes de leer este artículo se recomienda haber leído Usando Objetos.
Índice
-
Creando Objetos
Todas las clases tienen uno o mas métodos usados para crear el objeto. Estos métodos son llamados los constructores (ya que construyen el objeto). El nombre del constructor es siempre el nombre de la clase. Como todos los métodos, estos pueden o no tener argumentos.
Por ejemplo hay un constructor String de la clase String que recibe un objeto String existente. Este hará que el nuevo objeto sea una replica del objeto que recibe como argumento. Por ejemplo:
String ("Hello world!");Este mensaje hace la requisición que el nuevo objeto represente los caracteres "Hello world!" (que sea una copia de el String constante recibido como argumento). Los mensajes son mandados a objetos, pero en el caso de los constructores, no tenemos uno todavía. Estamos tratando de crearlo. Es decir no hay objeto que reciba este mensaje. Usamos la palabra reservada new para crear un objeto que pueda recibir este mensaje e invocar el constructor: Los nuevos objetos por lo tanto pueden provenir de dos lugares: que sean creados y devueltos por un método o que sean creados por el operador new.
new String("Hello world!");El operador new me devuelve una referencia al objeto recién creado. Necesitamos almacenar la referencia si queremos mandarle mensajes en el futuro al objeto recién creado. Esto lo hacemos por medio de la asignación.
String s, t; s = new String("Hello world"); t = s.substring(0,4); System.out.println(t);El constructor del String esta sobrecargado. El enunciado siguiente es totalmente valido.
String s; s = new String(); /* crea una nueva hilera vacia, "". Este es otro constructor que no recibe ningun argumento.*/ -
Archivos de Disco
-
Introducción
Los archivos de disco tienen dos atributos:
- Contenido
- Un nombre
Dados estos atributos, las operaciones mas comunes sobre archivos incluyen:
- Crear un archivo y proveerlo de contenido
- Eliminar un archivo (y su contenido)
- Renombrar un archivo (cambiar solo el nombre)
- Reescribir un archivo (cambiar solo el contenido)
- Obtener el contenido.
Java provee una clase predefinida para modelar a los archivos de disco llamada File. El constructor de la clase File recibe el nombre del archivo como argumento.
new File(nombre-archivo);Por ejemplo:
File f; f = new File("CartaParaJuan");crea un objeto File y le asocia el archivo CartaParaJuan. Cuando el objeto File se crea, el archivo de disco correspondiente no es creado. Es decir que si el archivo CartaParaJuan no existía, los dos enunciados anteriores no lo crearan. El objeto File solo representa un posible archivo, pero no garantiza que exista.
Sin embargo, si el archivo correspondiente si existe, el objeto File provee dos métodos para modelar algunas de las operaciones sobre archivos. Podemos eliminar un archivo usando el método delete. Por ejemplo para eliminar un archivo llamado basura escribiríamos:
File f; f = new File("basura"); f.delete();Para renombrar un archivo usamos el metodo renameTo. Por ejemplo, si quisiéramos renombrar el archivo CartaParaJuan a CartaParaPedro escribiríamos:
File f1, f2; f1 = new File("CartaParaJuan"); f2 = new File("CartaParaPedro"); f1.renameTo(f2); -
Escritura
En Java se crean nuevos archivos y se sobre-escriben archivos existentes de la misma forma. Para hacerlo necesitamos crear un flujo de salida y asociarlo al archivo. Java provee la clase FileOutputStream para modelar el flujo de salida hacia un archivo. El constructor recibe un archivo como argumento.
new FileOutputStream(archivo);Por ejemplo:
File f; FileOutputStream fs; f = new File("CartaParaJuan"); fs = new FileOutputStream(f);En el constructor del FileOutputStream el archivo se crea si no existía o su contenido se elimina si ya existía. Este objeto modela el flujo de salida como una secuencia de bytes, pero no reconoce su organización en unidades mas grandes como las hileras. Por lo tanto no provee métodos convenientes para escritura.
Hasta ahora la salida se ha manejado mandando los mensajes print y println al objeto System.out de la clase PrintStream. La clase PrintStream provee un constructor para crear un objeto y asociarlo con un FileOutputStream (y asi tener una salida simple al archivo a través de print y println). El constructor recibe un objeto FileOutputStream. Este quedaría así:
new PrintStream(fileoutputstream);Por ejemplo:
import java.io.*; class PrimerArchivo { public static void main(String args[]) throws Exception { /* asocia diskFile a un archivo fisico data.out del disco.*/ File diskFile = new File("data.out"); /* crea el archivo si no existia y asocia el archivo con un flujo de salida burdo.*/ FileOutputStream dfs = new FileOutputStream(diskFile); /* asocia el flujo de salida del archivo a un flujo de salida coqueto.*/ PrintStream salida = new PrintStream(dfs); salida.println("Hola archivo de disco!"); // esta hilera ya se escribe al archivo } }Notas
- Cuando interactuamos con el ambiente hay mas oportunidades donde nuestro programa puede fracasar. Por ejemplo si el programa anterior corre en un directorio en donde no tenemos privilegios de escritura el programa fracasara. Java exige que el programador advierta las fallas potenciales de este tipo agregando throws Exception al encabezado.
- Porque lo diseñaron de esta forma? Porque el FileOutputStream no provee un método como print? La razón es que el FileOutputStream se puede usar de muchas formas diferentes. Nuestro interés es un uso simple: mandarle hileras con println. Sin embargo hay otras formas de hacer la salida. En vez de que el FileOutputStream modele todas, únicamente modela un flujo de salida yendo hacia un archivo y algo mas. Para usar capacidades adicionales necesitamos recurrir a otras clases, como PrintStream, que están construidas para ese comportamiento.
- Escribir un programa que escriba su teléfono a un archivo llamado MiTelefono.
- Escribir un programa que cree un archivo vacío que se llame Nada.
Ejercicio para la clase
-
-
Lectura
-
Introducción
Todavía no hemos considerado como usar la información que provienen de archivos y del teclado. Toda la información que nuestros programas han necesitado, la hemos incrustado en el programa. Si nosotros pudiéramos recibir información como hileras de fuera del programa, este seria mas genérico.
En la clase anterior vimos que para escribir a un archivo se llevaban las siguientes etapas generales:
- Se creaba un objeto de la clase File.
- Se creaba un objeto de la clase FileOutputStream.
- Se creaba un objeto de la clase PrintStream
Si la entrada proviene del teclado, de un archivo o de un conexión de red, se requieren una secuencia de etapas similares:
- Se construye un objeto que modele algún flujo de entrada. Para el caso de archivos es un FileInputStream, para el teclado es un BufferedInputStream y para las conexiones de red es un InputStream.
- Dado que el flujo de entrada trabaja directamente con bytes, necesitamos un puente para proveer un flujo de entrada que trabaje directamente con caracteres (utilizando la codificación adecuada). Por esta razón sobre este construimos un InputStreamReader.
- Se usa el flujo de entrada anterior para construir un objeto de la clase BufferedReader. Este le agrega funcionalidad al flujo de entrada, ofreciendo métodos simples como readLine (que lee una línea completa).
En resumen, para implementar la entrada se necesita:
- Crear un objeto de la clase InputStream, FileInputStream o BufferedInputStream.
- Crear un objeto de la clase InputStreamReader.
- Crear un objeto de la clase BufferedReader.
-
Entrada del Teclado
Java ya provee una referencia al BufferedInputStream que representa al teclado, System.in, por lo que no es necesario crear este objeto. Únicamente necesitamos mandarlo como argumento al constructor, al crear un objeto de la clase BufferedReader. Ha este objeto ya le podemos mandar mensajes usando readLine.
Ejemplo: el siguiente programa lee una palabra del teclado y despliega su forma plural. Se asume que la única regla para convertir una palabra a plural es agregarle la letra "s" al final.
import java.io.*; class Plural { public static void main(String args[]) throws Exception { String inputLine; BufferedReader keyboard; keyboard = new BufferedReader(new InputStreamReader(System.in)); // asocia la entrada al teclado inputLine = keyboard.readLine(); // lee la linea System.out.print(inputLine); System.out.println("s"); } }Ejercicio para la clase
Escribir un programa que lee dos hileras del teclado. La primera será el nombre del archivo a abrirse y la segunda es el contenido a escribirse en dicho archivo.
-
Entrada y Salida Interactiva
El teclado solo es una fuente de entrada para los programas. Otras fuentes pueden incluir archivos de disco o incluso otros programas corriendo en la computadora. Vamos ha explorar todas estas fuentes a través del curso.
Una característica de la entrada del teclado es que involucra un humano, a veces llamado un usuario final. En la practica, los usuarios finales casi nunca son los autores de los programas que usan. Por esto, no se debe esperar al usuario final que sepa que escribir al teclado y cuando escribirlo. Un programa que espera una entrada desde el teclado, debe de proveer esta información al usuario. Por ejemplo, en nuestro ejemplo anterior pudimos haber desplegado un mensaje como: "Por favor ingrese una palabra para ser convertida a plural:"antes de pedir la palabra. Este prompt le diría al usuario que escribir por el teclado. Sabemos como escribir una frase al monitor, mandándole el mensaje print al System.out. Podríamos creer que esto lo podemos hacer de la siguiente forma:
System.out.println("Por favor ingrese una palabra para ser convertida a plural:"); inputLine = keyboard.readLine();Desafortunadamente, el prompt puede que se despliegue incluso después de la lectura de la línea, perdiendo todo su propósito. La razón de esto es la forma en que trabaja el PrintStream.
Un objeto PrintStream recibe un mensaje print o println y eventualmente despliega la hilera requerida. La palabra clave aquí es eventualmente. PrintStream se comporta de una forma similar a como nosotros nos comportaríamos si tuviéramos que mandar muchas cartas por correo. Nosotros no escribimos una carta, la llevamos al correo y regresamos a escribir la siguiente. Nosotros escribimos muchas cartas (todas la que hemos planeado) y las llevamos todas juntas al correo. Asi nos ahorramos muchos viajes al correo.
En tiempo de computadora es costoso llevar una sola hilera de caracteres a un dispositivo de salida, como la pantalla. Es mas eficiente transferirlo todo al mismo tiempo, o por lo menos en lotes grandes. Por lo que el PrintStream los Strings que va ha desplegar en una como área de espera en memoria, llamado un buffer. El PrintStream no despliega el contenido del buffer hasta que el programa termine o el buffer se llene.
Al escribir a un archivo esto esta bien, ya que al archivo no le importa esperar. Cuando se trata de desplegar prompts esto es un desastre. Para componer esto, PrintStream incluye otro método que le fuerza a escribir todo lo que tiene en el buffer a pantalla. Este método se llama flush. Entonces el código quedaría así:
System.out.println("Por favor ingrese una palabra para ser convertida a plural:"); System.out.flush(); inputLine = keyboard.readLine();Ejercicios para la clase
- La mayoría de sistemas de computación proveen un utilitario que elimina un archivo. Escriba un programa que haga esto. El programa deberá pedir el nombre del archivo a eliminar. Después lo deberá eliminar.
- Escriba un programa que renombra un archivo. El programa le deberá pedir al usuario el nombre original y el nuevo nombre. Después de esto el programa deberá renombrar el archivo a su nombre correspondiente.
-
Entrada de un Archivo
Escribir un programa que lea de un archivo es levemente mas sofisticado que la lectura del teclado. Nuestro punto de partida para cualquier lectura es siempre encontrar algún flujo de entrada. En el caso del teclado es el BufferedInputStream. En el caso de un archivo es el FileInputStream. Este lo usamos para crear un objeto BufferedReader que nos provee el método simple de entrada readLine (que ya hemos trabajado antes). El ejemplo que sigue despliega la primera línea del archivo llamado "alguien.txt".
La construccion del FileInputStream es similar a la construccion del FileOutputStream.
File f = new File("alguien.txt"); FileInputStream fis = new FileInputStream(f); BufferedReader fileInput = new BufferedReader(new InputStreamReader(fis)); String inputLine; inputLine=fileInput.readLine(); System.out.println(inputLine);Ejemplo completo
Escribamos un programa que lee interactivamente desde el teclado el nombre de un archivo que contiene dos líneas de información. El programa deberá crear una copia del archivo El nombre de la copia será el mismo que nombre que el archivo original con ".copy" concatenado al final.
import java.io.*; class Copia { public static void main (String args[]) throws Exception { BufferedReader keyboard; InputStreamReader isrKeyb; String fileNameOrig; File fOrig; FileInputStream fisOrig; InputStreamReader isrOrig; BufferedReader brOrig; String fileNameCopy; File fCopy; FileOutputStream fosCopy; PrintStream psCopy; String s; isrKeyb = new InputStreamReader(System.in); keyboard = new BufferReader (isrKeyb); System.out.print("Nombre de archivo a copiar:"); System.out.flush(); fileNameOrig = keyboard.readLine(); fileNameCopy = fileNameOrig.concat(".copy"); fOrig = new File(fileNameOrig); fisOrig = new FileInputStream(fOrig); isrOrig = new InputStreamReader(fisOrig); brOrig = new BufferedReader(isrOrig); fCopy = new File(fileNameCopy); fosCopy = new FileOutputStream(fCopy); psCopy = new PrintStream(fosCopy); s = brOrig.readLine(); psCopy.println(s); s = brOrig.readLine(); psCopy.println(s); } }Ejercicios para la clase
- Supongan que hay un archivo llamado Cantante (que contendrá el nombre de un cantante famoso), y otro llamado Actriz (que contendrá el nombre de una actriz famosa). En ambos casos la información se encuentra en una sola línea. Escriba un programa llamado Predictor, que deberá producir un archivo llamado Predicciones de una sola línea que contendrá una predicción que dicho cantante se casara con dicha actriz.
- Escriba un programa llamado GeneradorDeSaludos, que lee una sola línea de un archivo llamado Saludos y produce un archivo llamado Saludos.java que contiene un programa de Java simple que al ser compilado y corrido desplegara la línea dada (en el archivo Saludos). Para representar una comilla doble en un String use la combinación \".
- Reescriba el programa Copia usando composición para eliminar algunas de las variables y acortar el programa.
-
-
Redes
-
Introducción
Una red de computación es un conjunto de computadoras que pueden intercambiar información directamente. Internet es un conjunto de redes de computación que le permiten a la computadora intercambiar información con cualquier otra computadora en cualquier red. Tu puedes entrar a Internet instalando el software necesario y conectándote a través de alguna de estas redes.
Cada computadora en Internet tiene su propia Internet Address. Las direcciones en Internet pueden ser tratadas como hilera de caracteres, (www.sugermontano.edu.gt, por ejemplo).
La información en Internet esta organizada en unidades, llamados Recursos de Red. Estos pueden ser imágenes, audio, texto, etc. Cada recurso puede ser identificado de forma única por lo que se llama URL (Universal/Uniform Resource Locator). El URL no es arbitrario, ya que esta compuesto de partes, cada una con los siguientes significados:.
Parte Ejemplo Proposito protocolo http identifica el tipo de software necesario para acceder los datos Internet Address www.fisicc-ufm.edu identifica lo computadora que cuenta con el recurso nombre del archivo index.html identifica el archivo que contiene el recurso Organizadas junto quedaría así:
protocolo://Internet-address/nombre de archivoPor ejemplo:
http://www.sugermontano.edu.gt/index.htmllo cual significa que usando HTTP contacte a www.sugermontano.edu.gt y pídale index.html.
-
Entrada desde la red
Obtener información de la red, es tan solo un poco mas elaborado que de un archivo. De nuevo la clave esta en obtener algún InputStream que modele el comportamiento fundamental de un flujo de entrada.
Hay dos pasos fundamentales para obtener información de la red:
- Identificar el URL que contiene el recurso que deseamos
- Establece una conexión con la maquina que cuenta con este recurso
Correspondientemente, Java cuenta con una clase URL, que modela los URL's y URLConnection que modela las conexiones que hacemos para obtener dichos recursos. El constructor de la clase URL recibe una hilera como argumento (el URL como nosotros lo conocemos). Por ejemplo:
URL u = new URL("http://fisicc-ufm.edu/index.html");A su vez la clase URL provee de un método openConnection, que devuelve una referencia a un objeto URLConection. Por ejemplo:
URLConection uC = u.openConection();En realidad este método lleva a cabo bastante trabajo:
- Establece el software de comunicación en su maquina
- Inicializa el contacto con la maquina remota
- Espera una respuesta
- Establece la conexión
- Construye un objeto URLConnection, que modela dicha conexión, devolviendo una referencia a este.
La clase URLConnection tiene un método que nos interesa: getInputStream. Como es de suponer, este método devuelve un flujo de entrada burdo sobre el cual podemos para leer el contenido del archivo. Quedaría así:
InputStream is = uC.getInputStream();Media vez tenemos construido el InputStream, seguimos la misma secuencia de pasos que desde el teclado.
Ejemplo completo: Escribir un programa que baja las primeras cinco líneas de la pagina del Promedio Dow Jones.
import java.io.*; import java.net.*; class Red { public static void main(String args[]) throws Exception { String inputLine; URL u = new URL("http://quotes.yahoo.com/"); URLConnection uC = u.openConnection(); InputStream is = uC.getInputStream(); InputStreamReader isr = new InputStreamReader(is); BufferedReader remote = new BufferedReader(isr); inputLine = remote.readLine(); System.out.println(inputLine); inputLine = remote.readLine(); System.out.println(inputLine); inputLine = remote.readLine(); System.out.println(inputLine); inputLine = remote.readLine(); System.out.println(inputLine); inputLine = remote.readLine(); System.out.println(inputLine); } }Ejercicio de clase
Escribir un programa que pregunte y lea una hilera de caracteres (supongamos que es X). El programa deberá construir un URL a http://www.X.com/, donde X representa la hilera. El programa deberá desplegar las primeras cinco líneas del recurso. Por ejemplo si el usuario escribió "ibm", las primeras cinco líneas de http://www.ibm.com/ se desplegarán.
-
Siguiente articulo que se recomienda leer: Definiendo Clases

8 comments
Jump to comment form | comments rss [?]