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.