1. URLklasse

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
URL url = new URL("https://codegym.cc");
InputStream input = url.openStream();
byte[] buffer = input.readAllBytes();
String str = new String(buffer);
System.out.println(str);
Oppretter et URL-objekt med banen til siden
Henter et InputStreamfra 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
<!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″>
    ...

Sammenligne arbeid med FileogURL

URLligner på Fileeller Path, men Pathlagrer banen til en ressurs i filsystemet, og URLlagrer banen til en ressurs på Internett.

All magien skjer når vi får et InputStreamobjekt 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
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. URLConnectionklasse

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
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
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-resourcesblokk for sikker håndtering. Og det ville ikke skade å pakke det nakne InputStreamog OutputStreami noe mer praktisk. For eksempel i PrintStreamog 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
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);

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 Filesklassens copymetoder. Klassen Fileshar 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 URLbildet var kort, kan denne koden til og med skrives på en enkelt linje:

Kopiere data fra en strøm til en fil
Files.copy(
   new URL("https://www.google.com/logo.png").openStream(),
   Path.of("c:\\GoogleLogo.png")
);

Du trenger selvfølgelig ikke skrive det slik, men dette eksemplet viser hvor praktiske og kraftige I/O-strømmer er i Java.