1. URL
klass
Vi har studerat att arbeta med I/O-strömmar. Vi har studerat att arbeta med filer. Vad ska vi studera härnäst? Hur är det med att arbeta med nätverket, inklusive internet? Låter lovande, eller hur?
I Java är det inte svårare att arbeta med Internet än att arbeta med filer. Tja, kanske bara lite.
För att arbeta med Internetresurser har Java en speciell klass — URL
. Det är så enkelt som en pall, som du nu kommer att se.
Skaffa en webbsida
Hur många rader kod tror du att du behöver skriva för att ladda ner en textfil från Internet och visa dess innehåll på skärmen? 10? 100? 1000? Eller kanske 5?
Koda | Notera |
---|---|
|
Skapar ett URL-objekt med sökvägen till sidan Får ett InputStream från URL-objektet Läser alla byte och returnerar en array med byte Konvertera arrayen till en sträng Visa strängen |
Innehållet i en HTML-fil kommer att visas på skärmen:
Konsolutgång |
---|
|
Jämföra arbete med File
ochURL
URL
liknar File
eller Path
, men Path
lagrar sökvägen till en resurs i filsystemet och URL
lagrar sökvägen till en resurs på Internet.
All magi händer när vi får ett InputStream
objekt tack vare ett enda anrop till openStream()
metoden. Detta är ett vanligt föremål, och vi har redan studerat det inifrån och ut. Allt blir uppenbart efter att vi fått InputStream
föremålet. När allt kommer omkring vet vi redan hur man får data från det.
Ta en titt: bara de två första raderna är olika, och bara lite. Och nu kan du se det - fördelen med standardisering och att arbeta med kedjor av dataströmmar:
Arbeta med Internet | Arbeta med en fil |
---|---|
|
|
2. URLConnection
klass
Förutom att helt enkelt läsa data från Internet kan vi även ladda upp data. Att ladda upp data är mycket mer komplicerat än att läsa det. Du kommer att behöva några fler metoder. Till exempel:
Koda | Notera |
---|---|
|
Skapa ett URL-objekt med sökvägen till sidan Skapa en tvåvägsförbindelse Få en utdataström Lägg data i den Få en indataström Läs data från den |
Observera att vi inte längre kallar url.openStream()
metoden här. Istället tar vi en längre väg:
- Vi upprättar först en stabil tvåvägsförbindelse med
URLConnection.openConnection()
metoden - Sedan får vi en stream för att skicka data med
connection.getOutputStream()
metoden och skicka data till servern - Sedan får vi en ström för att läsa data med
connection.getInputStream()
metoden och börjar läsa data från den.
Resurshantering
Strängt taget bör vi slå in alla bäckar i ett try-with-resources
block för säker hantering. Och det skulle inte skada att svepa in det nakna InputStream
och OutputStream
i något mer bekvämt. Till exempel i PrintStream
och BufferedReader
.
Om vi gör allt det kommer vår kod att se ut ungefär så här:
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. Exempel på att arbeta med nätverket
Låt oss ladda ner något från Internet. Och inte bara ladda ner det, utan spara det på disk.
Låt oss till exempel skriva ett program som sparar en bild från Googles hemsida till disk.
I princip är det inget komplicerat här. I sin enklaste form skulle den här koden se ut så här:
Sparar en fil på disk |
---|
|
Med hjälp av de tre första raderna får vi en dataström från en internetresurs — från en bild.
På den fjärde raden skapar vi namnet på filen som vi ska spara bilden till. Namnet kan vara vad som helst, men filtillägget måste matcha förlängningen av bilden på Internet. Det gör att lokala bildvisare kan öppna den korrekt.
Och slutligen, den sista raden är en av Files
klassens copy
metoder. Klassen Files
har flera av dem. Denna metod, som vi använde, tar en byteström ( InputStream
) som sin första parameter, och som den andra parametern - namnet på filen där data ska skrivas.
Teoretiskt, om URL
bildens bild var kort, skulle den här koden till och med kunna skrivas på en enda rad:
Kopiera data från en ström till en fil |
---|
|
Naturligtvis behöver du inte skriva det så här, men det här exemplet visar hur bekväma och kraftfulla I/O-strömmar är i Java.
GO TO FULL VERSION