Newsgroup: it.comp.java
Titolo: Comportamento apparentemente :) inspiegabile

Ciao a tutti,
ho notato un comportamento veramente curioso. Incollo qui sotto un riassunto
del codice che potete provare.
Il programma scarica la pagina di cui mettete l'indirizzo e la copia in una
stringa. La funzione scarica() sembra funzionare quindi lasciatela stare ;)
La funzione analizza() scorre la stringa in cerca di un tag, quando lo trova
controlla se è un A (Anchor) e se lo è lo stampa a video.
Funziona con tutte le pagine che ho trovato tranne con questa:
http://www.dis.uniroma1.it
provatelo.
poiché assumo di analizzare pagine web corrette, pagina.indexOf('>',inizio);
dovrebbe restituire sempre un valore maggiore di inizio perché ogni
parentesi angolare aperta da qualche parte viene chiusa.
Fa eccezione il javascript che puo' avere dei maggiori o minori.
Cmq la cosa singolare è che quando si arriva nel ramo else ottengo il
seguente output:
errore!
inizio: 1091 lunghezza pagina: 5554
lunghezza sottostringa: 4463
<d.forms.length;i++) x=
d.fo
finito
Come vedete quella nella riga prima di finito non è una stringa da 4463
caratteri :) Come ve lo spiegate? Inoltre pagina.indexOf('>',inizio) non
dovrebbe restituire -1 in quel punto del file, visto che ci sono altre
parentesi angolari chiuse in giro.
Vi copio il codice e mi dite cosa ne pensate:
import java.io.*;
import java.net.*;
import java.util.*;
public class Main {
    private Main() {}
    public static void main(String[] args) throws IOException{
 
        //metti qui l'url che vuoi, questo è quello anomalo
        URL url = new URL("
http://www.dis.uniroma1.it
");
        String pagina = scarica(url);
        analizza(pagina);
    }
 
    private static String scarica(URL pagina) throws IOException {
 
        URLConnection conn = pagina.openConnection();
        conn.connect();
        int lunghezza = conn.getContentLength();
 
        String scaricata;
 
        if(lunghezza >=0) {
            System.out.println("lunghezza: "+lunghezza+" bytes");
            byte[] buffer = new byte[lunghezza];
            InputStream in = conn.getInputStream();
            in.read(buffer);
            scaricata = new String(buffer);
        }
        else {
         BufferedReader br = new BufferedReader(new
InputStreamReader(conn.getInputStream()));
         String linea = null;
         StringBuffer buffer = new StringBuffer();
         while((linea = br.readLine()) != null) {
             buffer.append(linea);
         }
          scaricata = new String(buffer);  
        }
 
        return scaricata;
    }
 
    private static void analizza(String pagina) {
 
        System.out.println("ora cerco");
 
        int posizione = 0;
        int inizio;
        while((inizio = pagina.indexOf('<', posizione))>=0) {
            int fine = pagina.indexOf('>',inizio);
            if(fine>=0) {
                String tag = pagina.substring(inizio+1,fine);
                StringTokenizer tokenizer = new StringTokenizer(tag);
                if(tokenizer.hasMoreTokens()) {
                    if(tokenizer.nextToken().equalsIgnoreCase("a")) {
                        System.out.println(tag);
                    }
                }
                posizione = fine+1;
            }
            else {
                System.out.println("errore!");
                System.out.println("inizio: "+inizio+" lunghezza pagina:
"+pagina.length());
                String s = pagina.substring(inizio);
                System.out.println("lunghezza sottostringa: "+s.length());
                System.out.println(s);
                break;
            }
 
        }
        System.out.println("finito");
    }
 
}
Grazie!!
Matteo
-- 
chi sono e soprattutto chi non sono:
http://www.ilnomedeldominio.it
un piccolo programma per studenti universitari:
http://inutility.ilnomedeldominio.it

 stare ;) 
Ovviamente l'errore era in scarica() :) dopo un giorno in cui non capivo che
cacchio succedeva alla fine mi è venuto il sospetto che stavo dando per
scontato una cosa sbagliata ;)
cmq mi spiegate perché non funziona bene, cioé quello che scarica non è
tutto il file?
Questo è il pezzo incriminato:
 URLConnection conn = pagina.openConnection();
 conn.connect();
 int lunghezza = conn.getContentLength();
        
 String scaricata;
        
 if(lunghezza >=0) {
            System.out.println("lunghezza: "+lunghezza+" bytes");
            byte[] buffer = new byte[lunghezza];
            InputStream in = conn.getInputStream();
            in.read(buffer);
            scaricata = new String(buffer);
  }
Grazie


             in.read(buffer);
Non controlli il valore ritornato da in.read(buffer)
che non sempre è eguale a buffer.length.
Mai dato un occhio alla documentazione di InputStream.read...?
- Dario

 che non sempre è eguale a buffer.length.
Anche se contentLength mi dice che ci sono n byte da scaricare lo stream
potrebbe leggerne di meno? Se è così allora certamente il problema è
questo ;)
Ciao
