1. URLklass

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
URL url = new URL("https://codegym.cc");
InputStream input = url.openStream();
byte[] buffer = input.readAllBytes();
String str = new String(buffer);
System.out.println(str);
Skapar ett URL-objekt med sökvägen till sidan
Får ett InputStreamfrå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
<!DOCTYPE html><html lang="ru" class="light"><head>
    <meta charset="utf-8″>
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1″>
    ...

Jämföra arbete med FileochURL

URLliknar Fileeller Path, men Pathlagrar sökvägen till en resurs i filsystemet och URLlagrar sökvägen till en resurs på Internet.

All magi händer när vi får ett InputStreamobjekt 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 InputStreamfö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
URL url = new URL("https://codegym.cc");
InputStream input = url.openStream();

byte[] buffer = input.readAllBytes();
String str = new String(buffer);
System.out.println(str);
File file = new File("c:\\readme.txt");
InputStream input = new FileInputStream(file);

byte[] buffer = input.readAllBytes();
String str = new String(buffer);
System.out.println(str);


2. URLConnectionklass

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
URL url = new URL("https://codegym.cc");
URLConnection connection = url.openConnection();

// Get a stream for sending data
OutputStream output = connection.getOutputStream();
output.write(1); // Send data

// Get a stream for reading data
InputStream input = connection.getInputStream();
int data = input.read(); // Read data
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-resourcesblock för säker hantering. Och det skulle inte skada att svepa in det nakna InputStreamoch OutputStreami något mer bekvämt. Till exempel i PrintStreamoch 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
String image = "https://www.google.com/images/branding/googlelogo/1x/googlelogo_color_272x92dp.png";
URL url = new URL(image);
InputStream input = url.openStream();

Path path = Path.of("c:\\GoogleLogo.png");
Files.copy(input, path);

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 Filesklassens copymetoder. Klassen Fileshar 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 URLbildens 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
Files.copy(
   new URL("https://www.google.com/logo.png").openStream(),
   Path.of("c:\\GoogleLogo.png")
);

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.