1. URL
klasse
Vi har studert arbeid med I/O-strømmer. Vi har studert arbeid med filer. Hva bør vi studere videre? Hva med å jobbe med nettverket, inkludert Internett? Høres lovende ut, ikke sant?
I Java er det ikke vanskeligere å jobbe med Internett enn å jobbe med filer. Vel, kanskje bare litt.
For å jobbe med Internett-ressurser har Java en spesiell klasse - URL
. Det er så enkelt som en krakk, som du nå vil se.
Å få en nettside
Hvor mange linjer med kode tror du du må skrive for å laste ned en tekstfil fra Internett og vise innholdet på skjermen? 10? 100? 1000? Eller kanskje 5?
Kode | Merk |
---|---|
|
Oppretter et URL-objekt med banen til siden Henter et InputStream fra URL-objektet Leser alle byte og returnerer en matrise med byte Konverter matrisen til en streng Vis strengen |
Innholdet i en HTML-fil vil vises på skjermen:
Konsollutgang |
---|
|
Sammenligne arbeid med File
ogURL
URL
ligner på File
eller Path
, men Path
lagrer banen til en ressurs i filsystemet, og URL
lagrer banen til en ressurs på Internett.
All magien skjer når vi får et InputStream
objekt takket være et enkelt kall til openStream()
metoden. Dette er en vanlig gjenstand, og vi har allerede studert den innvendig og utvendig. Alt blir åpenbart etter at vi får objektet InputStream
. Tross alt vet vi allerede hvordan vi får data fra det.
Ta en titt: bare de to første linjene er forskjellige, og bare litt. Og nå kan du se det – fordelen med standardisering og arbeid med kjeder av datastrømmer:
Arbeide med Internett | Arbeide med en fil |
---|---|
|
|
2. URLConnection
klasse
I tillegg til å bare lese data fra Internett, kan vi også laste opp data. Å laste opp data er mye mer komplisert enn å lese det. Du kommer til å trenge noen flere metoder. For eksempel:
Kode | Merk |
---|---|
|
Opprett et URL-objekt med banen til siden Opprett en toveisforbindelse Få en utdatastrøm Legg data i den Få en inputstrøm Les data fra den |
Merk at vi ikke lenger kaller url.openStream()
metoden her. I stedet tar vi en lengre rute:
- Vi etablerer først en stabil toveisforbindelse ved hjelp av
URLConnection.openConnection()
metoden - Så får vi en strøm for å sende data ved hjelp av
connection.getOutputStream()
metoden og sende data til serveren - Da får vi en strøm for å lese data ved hjelp av
connection.getInputStream()
metoden og begynner å lese data fra den.
Ressursforvaltning
Strengt tatt bør vi pakke alle bekker i en try-with-resources
blokk for sikker håndtering. Og det ville ikke skade å pakke det nakne InputStream
og OutputStream
i noe mer praktisk. For eksempel i PrintStream
og BufferedReader
.
Hvis vi gjør alt det, vil koden vår se omtrent slik ut:
URL url = new URL("https://codegym.cc");
URLConnection connection = url.openConnection();
// Send data
try (OutputStream output = connection.getOutputStream();
PrintStream sender = new PrintStream(output))
{
sender.println("Hello");
}
// Read data
try(InputStream input = connection.getInputStream();
BufferedReader reader = new BufferedReader(new InputStreamReader(input)))
{
while (reader.ready())
System.out.println(reader.readLine());
}
3. Eksempler på arbeid med nettverket
La oss laste ned noe fra Internett. Og ikke bare last ned det, men lagre det på disk.
La oss for eksempel skrive et program som lagrer et bilde fra Googles hjemmeside til disk.
I prinsippet er det ikke noe komplisert her. I sin enkleste form vil denne koden se slik ut:
Lagre en fil på disk |
---|
|
Ved hjelp av de tre første linjene mottar vi en datastrøm fra en Internettressurs — fra et bilde.
I den fjerde linjen lager vi navnet på filen som vi skal lagre bildet til. Navnet kan være hva som helst, men filtypen må samsvare med filtypen til bildet på Internett. Det vil tillate lokale bildevisere å åpne den riktig.
Og til slutt, den siste linjen er en av Files
klassens copy
metoder. Klassen Files
har flere av dem. Denne metoden, som vi brukte, tar en bytestrøm ( InputStream
) som sin første parameter, og som den andre parameteren - navnet på filen der dataene skal skrives.
Teoretisk sett, hvis URL
bildet var kort, kan denne koden til og med skrives på en enkelt linje:
Kopiere data fra en strøm til en fil |
---|
|
Du trenger selvfølgelig ikke skrive det slik, men dette eksemplet viser hvor praktiske og kraftige I/O-strømmer er i Java.