[Metodos] Manejo de URLs

Manejo de una URL:

Para manejar urls hacemos uso de 5 clases java, de los paquetes "io" y "net":
  1. En primer lugar creamos el objeto de la clase URL con su constructor, pasando por parametro el enlace:

  2. En segundo lugar, creamos un objeto de la abstracta URLConnection, la cual se instancia desde el objeto URL creado anteriormente que llama al siguiente método que devuelve un objeto URLConnection:
    • public URLConnection openConnection() throws IOException
    • Devuelve una instancia de un objeto URLConnection que "representa" una conexión con el objeto remoto que hace referencia la URL. Una nueva instancia de URLConnection se creará cada vez que se invoca el método URLStreamHandler.openConnection (URL) del controlador de protocolo para esta URL. Cabe señalar que una instancia de URLConnection no establece la conexión de red real en la creación. Esto sucederá solamente al llamar URLConnection.connect () que será el paso siguiente.
    • Devuelve
    • un objeto URLConnection con el enlace de la URL.
    • Arroja
    • IOException - si una I/O exception occure.

  3. Establece la conexión de red real de la instacia de URLConnection con el método:
    • public abstract void connect() throws IOException
    • Abre un enlace de comunicaciones con el recurso al que hace referencia este URL, si no ha sido ya establecido una conexión de este tipo. Si el método de conexión se llama cuando ya se ha abierto la conexión (indicado por el campo relacionado con el valor verdadero), se ignora la llamada.
    • Arroja:
      • SocketTimeoutException - si el tiempo de espera se agota antes de poder establecer la conexión
      • IOException - si se produce un error de E / S directa al abrir la conexión.

  4. Crearemos una instancia de la clase abstracta InputStrem, para lo cual la instancia de URLConnection llamara al metodo que devuelva un InputStrem
    • public InputStream getInputStream() throws IOException
    • Devuelve un InputStream que lee de esta conexión abierta. Un SocketTimeoutException puede ser lanzado durante la lectura del documento de entrada devuelto si el tiempo de espera para leer expira antes de que se dispone de datos para lectura.
    • Devuelve
    • un flujo de entrada(instancia InputStream) que lee de esta conexión abierta.
    • Arroja

  5. Crearemos un objeto de la clase InputStreamReader con el constructor:

  6. Seguimos creando un objeto de la clase BufferedReader, con el constructor:
    • public BufferedReader(Reader in)
    • Crea un flujo de caracteres de entrada de búfer que utiliza una memoria intermedia de entrada de tamaño predeterminado.
    • Parámetros
    • Reader in - Al objeto lector de la clase Reader o algun objeto de las clases hijas como InputStreamReader.

  7. Aqui ya podremos leer linea a linea del codigo HTML de una pagina con el metodo de BufferedReader:
    • public String readLine() throws IOException
    • Lee una línea de texto. Se considera que una fila se termina cuando hay cualquier salto de línea ('\ n'), o un retorno de carro ('\ r'), o un retorno de carro seguido inmediatamente por un salto de línea.
    • Devuelve:
    • Una cadena que contiene el contenido de la línea, sin incluir los caracteres de fin de línea, o null si se ha alcanzado el final de la secuencia
    • Arroja:
    • IOException - Si un I/O error occure.
  8. Una manera comun de trabajar, es creando un objeto String que almacenara cada linea, y dentro de un ciclo while, ir iterando cada linea HTML hasta alcanzar el final:
    • String lineaSalida = "";
    • while ((lineaSalida = in.readLine()) != null) {
    •      //TODO hacer algo, ejemplo salida por consola
    • }
  9. La condicion de cierre del ciclo, le pido que el buffer me traiga la siguiente linea para almacenarla en la cadena de texto. Al llegar al final de cualquier codigo sera nulo y dejara de iterar.
  10. Por ultimo, algo muy importante será cerrar el buffer con el metodo close()

Mi pseudo codigo es:

URL url = new URL(enlace);
URLConnection uc = url.openConnection();
uc.connect();

InputStream is = uc.getInputStream(); InputStreamReader isr = new InputStreamReader(is); BufferedReader in = new BufferedReader(isr);
String lineaSalida = ""; while ((lineaSalida = in.readLine()) != null) {     System.out.println(lineaSalida); } in.close();

Contenido en un metodo para ser llamado(Muestra contenido en consola):
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
public static void mostrarHTML(String enlace){
    try {
        URL url = new URL(enlace);
        URLConnection uc = url.openConnection();
        uc.connect();

        InputStream is = uc.getInputStream();
        InputStreamReader isr = new InputStreamReader(is);
        BufferedReader in = new BufferedReader(isr);

        String lineaSalida = "";
        while ((lineaSalida = in.readLine()) != null) {
            System.out.println(lineaSalida);
        }
        in.close();
    } catch (MalformedURLException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    }
}

Contenido en un metodo para ser llamado(Almacena contenido en un string):
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
public static String obtenerHTML(String enlace){
    String cadenaRetorno = "";
    try {
        URL url = new URL(enlace);
        URLConnection uc = url.openConnection();
        uc.connect();

        InputStream is = uc.getInputStream();
        InputStreamReader isr = new InputStreamReader(is);
        BufferedReader in = new BufferedReader(isr);

        String lineaSalida = "";
        while ((lineaSalida = in.readLine()) != null) {
            cadenaRetorno = cadenaRetorno.concat(lineaSalida) + "\n";
        }
        in.close();
        } catch (MalformedURLException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
    }
    return cadenaRetorno;
}

Una forma de llamar a este metodo:

String htmlGoogle = obtenerHTML("https://www.google.com.ar");


No hay comentarios:

Publicar un comentario