1 import java.io.*;
 2 import java.net.URL;
 3 import java.util.regex.*;
 4 
 5 public class LectorDeLinks {
 6     //Vamos a hacer uso de expresiones regulares. Dominarlas lleva una tarde (intensa) de estudio.
 7     //Concretaremos en la que nos interesa...
 8     //Queremos localizar expresiones del tipo: href="X"
 9     //Esas X podrán tener cualquier carácter menos " lo que se especifica como: [^"]
10     //Y además pueden tener cualquier longitud, lo que se incluye poniendo:  [^"]*
11     //Así que nuestra expresión regular es: href="[^"]*"
12     //Localizadas estas expresiones, las zonas que se quieran "capturar" se ponen entre paréntesis
13     //En nuestro caso es lo que hemos llamado X: href="([^"]*)"
14     //Pondremos la expresión en una String, por lo que las comillas deben ser precedidas por \:  "href=\"([^\"]*)\""
15     private static final Pattern PATRON=Pattern.compile("href=\"([^\"]*)\"");
16     
17   public static void main(String[] args) throws IOException {
18        //Lectura de los links tal cual estan
19        version1();
20        //Lectura de ls links convirtiendo en absolutos los que son relativos
21        //además en la versión anterior hemos leido de un buffered porque es como hemos actuado siempre al querer lineas
22        //Para este caso en realidad no es preciso y podemos hacer la lectura a más bajo nivel (con menos "envolorio")
23        version2();
24     }
25 
26   private static void version1() throws IOException {
27         URL url=new URL("http://gtts.ehu.es/German/Docencia/TAP/index.jsp");
28         
29         //Vamos a leer todo el fichero remoto sobre un StringBuilder linea a linea
30         //los caracteres de paso de linea no los regeneramos porque no nos importan
31         BufferedReader br = new BufferedReader(new InputStreamReader(url.openStream()));
32         StringBuilder sb=new StringBuilder();
33         String linea;
34         while ((linea = br.readLine()) != null) sb.append(linea);
35         br.close();
36         
37         //De la pagina web que tenemos ya en StringBuilder vamos a listar los enlaces "href"
38         Matcher m=PATRON.matcher(sb);
39         while(m.find()) System.out.println(m.group(1));
40     }
41   
42    private static void version2() throws IOException {
43         String dirBase="http://gtts.ehu.es/German/Docencia/TAP/";
44         URL url=new URL(dirBase+"index.jsp");
45         
46         //Vamos a leer todo el fichero remoto sobre un StringBuilder
47         //en bloques de 4096 caracteres 
48         Reader reader=new InputStreamReader(url.openStream());
49         StringBuilder sb=new StringBuilder();
50         char[] buffer=new char[4096];
51         int numBytes;
52         while ((numBytes=reader.read(buffer)) != -1) sb.append(buffer,0,numBytes);
53         reader.close();
54         
55         //Para la pagina web que tenemos ya en StringBuilder vamos generar un objeto capaz de hacer el "match" con el patron definido
56         //y a ir buscado cada "match" y sacando el grupo de captura definido en el patrón.
57         Matcher m=PATRON.matcher(sb);
58         while(m.find()) {
59             String link=m.group(1);
60             System.out.println(link.startsWith("http")?link:dirBase+link);
61         }
62     }
63 }
64