Hämta data mha URLer Föreläsning 7 Se också Harold då beskrivningen där är ganska fullständig. Se också Tut som är ganska rättfram. Innehåll • Klassen URL • Arbeta med URLer, exempel Speciella referenser (som används i här) • Harold, dvs kursboken ”Java Network Programming” • Tut, dvs SUNs tutorial (~kurs) om URLer på nätet, se http://java.sun.com/docs/books/tutorial/networking/urls/index.html previous next Hämta data mha URLer Klassen URL • I Java finns det en klass java.net.URL som hanterar URLer • Med denna klass kan man enkelt hämta filer från webservrar • En absolut URL skapas på följande sätt URL nada = new URL(”http://www.nada.kth.se/"); • En URL kan skapas relativt en annan URL ip = new URL(nada, ”kurser/kth/2D4334/index.html"); • Generellt kan vi ange både protokoll, webplats, fil och portnummer separat URL nada = new URL(”http”, ”www.nada.kth.se”, 80, ”kurser/kth/2D4334/index.html"); previous next 2 Hämta data mha URLer Kastande av undantag vid konstruktion av URL … • Då vi skapar en URL måste vi ta hand om undantaget MalformedURLException • Så vi konstruerar en URL på följande sätt try { URL myURL = new URL(. . .) } catch (MalformedURLException e) { . . . // felhantering här . . . } • dvs ta alltid ta hand om undantaget previous next 3 Hämta data mha URLer Läsa data mha av URL … • Vi kan med hjälp av en URL direkt be om innehållet i den fil den pekar ut – använd metoden getContent() – Observera att getContent() returnerar ett objekt som beror av innehållet, eller fallerar om den inte kan tolka vad som finns där Läs innehållet och i det här fallet ”casta” till lämplig typ try{ content = (BufferedInputStream)url.getContent(); } catch(IOException e) {} Skapa läsström BufferedReader buffer = new BufferedReader(new InputStreamReader(content)); String line; while((line = readLine(buffer)) != null) System.out.println(line); Läs radvis previous next 4 Hämta data mha URLer ... där readLine kan se ut ungefär så här: public String readLine(BufferedReader b) { String line = null; try{ line = b.readLine(); } catch(IOException e) {} return line; } • Mer generellt kan vi läsa innehållet via en URLConnection, se nästa sida previous next 5 Hämta data mha URLer Läsa och skriva mha URLConnection... • Om vi från en URL skapar en instans av en subklass till den abstrakta klassen URLConnection. Denna instans ger oss möjlighet att kontrollera vad som skall hända i lite mer detalj – Bland annat kan vi förutom läsa information från URLen också där det är möjligt skriva information till den – Vissa metoder i URL använder en URLConnection för att ”lösa sina uppgifter”, tex metoden getContent() – Se paketet sun.net.www.protocol för konkreta klasser, bland andra FtpURLConnection HttpURLConnection MailToURLConnection previous next 6 Hämta data mha URLer …exempel med indirekt URLConnection... • Man kan öppna en läsström men openStream() import java.net.*; import java.io.*; public class URLReader { public static void main(String[] args) throws Exception { URL nada = new URL("http://www.nada.kth.se/"); BufferedReader in = new BufferedReader( new InputStreamReader(nada.openStream())); String inputLine; while ((inputLine = in.readLine()) != null) System.out.println(inputLine); in.close(); } } previous next 7 Hämta data mha URLer … vi kan också använda URLConnection mer explicit import java.net.*; import java.io.*; public class URLConnectionReader { public static void main(String[] args) throws Exception { URL nada = new URL("http://www.nada.kth.se/"); URLConnection nc = nada.openConnection(); BufferedReader in = new BufferedReader( new InputStreamReader( nc.getInputStream())); String inputLine; while ((inputLine = in.readLine()) != null) System.out.println(inputLine); in.close(); } } • Om vi vill skriva kan vi använda URLConnections:s getOutputStream() (se Tut) previous next 8 Hämta data mha URLer Några exempel • Nu följer tre exempel på lite olika användning av URLer 1 Hämta innehållet från vad som pekas ut av en URL och skriv det antingen på skärmen eller på en fil 2 Skriv information om innehållet i den URL som pekas ut 3 Använd en URL och mailto: för att skicka elektronisk post previous next 9 Hämta data mha URLer Hämta innehållet i en URL import java.io.*; import java.net.*; public class GetURL { public static void main(String[] args) { Deklarera in- och InputStream in = null; utmatningsströmmar OutputStream out = null; try { if ((args.length != 1) && (args.length != 2)) throw new IllegalArgumentException("Wrong number of arguments"); Skapa URL URL url = new URL(args[0]); in = url.openStream(); if (args.length == 2) out = new FileOutputStream(args[1]); else out = System.out; öppna inström välj typ av utström (fil eller terminal) previous next 10 Hämta data mha URLer ... kopiera innehållet till utström byte[] buffer = new byte[4096]; int bytes_read; while((bytes_read = in.read(buffer)) != -1) out.write(buffer, 0, bytes_read); } catch (Exception e) { System.err.println(e); System.err.println("Usage: java GetURL <URL> [<filename>]"); } finally { try { in.close(); out.close(); } catch (Exception e) {} } stäng alltid strömmarna } } previous next 11 Hämta data mha URLer Skriv information om URL via URLConnection import java.net.*; import java.io.*; import java.util.Date; public class GetURLInfo { public static void printinfo(URL url) throws IOException { URLConnection c = url.openConnection(); Använd c.connect(); URLConnection System.out.println(" System.out.println(" System.out.println(" System.out.println(" System.out.println(" System.out.println(" previous next Content Type: " + c.getContentType()); Content Encoding: " + c.getContentEncoding()); Content Length: " + c.getContentLength()); Date: " + new Date(c.getDate())); Last Modified: " + new Date(c.getLastModified())); Expiration: " + new Date(c.getExpiration())); 12 Hämta data mha URLer ... Om det är en HTTPanslutning skriv ut lite mer info if (c instanceof HttpURLConnection) { HttpURLConnection h = (HttpURLConnection) c; System.out.println(" Request Method: " + h.getRequestMethod()); System.out.println(" Response Message: " + h.getResponseMessage()); System.out.println(" Response Code: " + h.getResponseCode()); } } public static void main(String[] args) { try {printinfo(new URL(args[0])); } catch (Exception e) { System.err.println(e); System.err.println("Usage: java GetURLInfo <url>"); } } Skapa URL och skriv ut info } previous next 13 Hämta data mha URLer Skicka e-post via en URL import java.io.*; import java.net.*; Om maildator angiven så tala om det för systemet public class SendMail { public static void main(String[] args) { try { if (args.length >= 1) System.getProperties().put("mail.host", args[0]); Inmatningsström från terminal BufferedReader in = new BufferedReader(new InputStreamReader(System.in)); Be användaren om brevhuvud previous System.out.print("From: "); String from = in.readLine(); System.out.print("To: "); String to = in.readLine(); System.out.print("Subject: "); String subject = in.readLine(); next Notera att likheten med att skicka brev i ett vanligt program för elektronisk post 14 Hämta data mha URLer ... Skapa en ”mailto:-url” URL u = new URL("mailto:" + to); URLConnection c = u.openConnection(); Vi vill skriva på “URLen” så vi använder en URLConnection c.setDoInput(false); // Ingen inmatning från URLen c.setDoOutput(true); // men däremot utmatning till den System.out.println("Connecting..."); System.out.flush(); Anslut c.connect(); PrintWriter out = new PrintWriter(new OutputStreamWriter(c.getOutputStream())); Utmatningsström skapas Skriv sidhuvud ”på URLen” previous out.println("From: \"" + from + "\" <" + System.getProperty("user.name") + "@" + InetAddress.getLocalHost().getHostName() + ">"); out.println("To: " + to); out.println("Subject: " + subject); out.println(); // vi avslutar med en tom rad (som indikerar att brevhuvudet är klart) next 15 Hämta data mha URLer ... Be användaren skriva brevkroppen System.out.println("Enter the message. " + "End with a '.' on a line by itself."); String line; for(;;) { line = in.readLine(); if ((line == null) || line.equals(".")) break; out.println(line); } Läs brevkropp och skriv den på ”URLen” out.close(); System.out.println("Message sent."); System.out.flush(); } catch (Exception e) { System.err.println(e); System.err.println("Usage: java SendMail [<mailhost>]"); } } } previous next 16