1. URLklasse

Vi har studeret arbejde med I/O-streams. Vi har studeret arbejdet med filer. Hvad skal vi så studere? Hvad med at arbejde med netværket, inklusive internettet? Det lyder lovende, gør det ikke?

I Java er det ikke sværere at arbejde med internettet end at arbejde med filer. Nå, måske bare en lille smule.

For at arbejde med internetressourcer har Java en speciel klasse — URL. Det er så enkelt som en skammel, som du nu vil se.

At få en webside

Hvor mange linjer kode tror du, du skal skrive for at downloade en tekstfil fra internettet og vise dens indhold på skærmen? 10? 100? 1000? Eller måske 5?

Kode Bemærk
URL url = new URL("https://codegym.cc");
InputStream input = url.openStream();
byte[] buffer = input.readAllBytes();
String str = new String(buffer);
System.out.println(str);
Opretter et URL-objekt med stien til siden
Henter et InputStreamfra URL-objektet
Læser alle bytes og returnerer et array af bytes
Konverter arrayet til en streng
Vis strengen

Indholdet af en HTML-fil vil blive vist på skærmen:

Konsoludgang
<!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″>
    ...

Sammenligning af arbejde med FileogURL

URLligner Fileeller Path, men Pathgemmer stien til en ressource i filsystemet og URLgemmer stien til en ressource på internettet.

Al magien sker, når vi får et InputStreamobjekt takket være et enkelt kald til openStream()metoden. Dette er et almindeligt objekt, og vi har allerede studeret det inde og ude. Alt bliver tydeligt, efter vi har fået InputStreamgenstanden. Vi ved jo allerede, hvordan man får data fra det.

Tag et kig: kun de to første linjer er forskellige, og kun lidt. Og nu kan du se det - fordelen ved standardisering og arbejde med kæder af datastrømme:

Arbejde med internettet Arbejde 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

Udover blot at læse data fra internettet, kan vi også uploade data. At uploade data er meget mere kompliceret end at læse det. Du får brug for et par flere metoder. For eksempel:

Kode Bemærk
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
Opret et URL-objekt med stien til siden
Opret en tovejsforbindelse


Hent en outputstrøm
Læg data i den


Få en inputstrøm
Læs data fra den

Bemærk, at vi ikke længere kalder url.openStream()metoden her. I stedet tager vi en længere rute:

  • Vi etablerer først en stabil tovejsforbindelse ved hjælp af URLConnection.openConnection()metoden
  • Så får vi en stream til at sende data ved hjælp af connection.getOutputStream()metoden og sende data til serveren
  • Så får vi en strøm til at læse data ved hjælp af connection.getInputStream()metoden og begynder at læse data fra den.

Ressourcestyring

Strengt taget bør vi pakke alle vandløb ind i en try-with-resourcesblok for sikker håndtering. Og det ville ikke skade at pakke det bare InputStreamind OutputStreami noget mere bekvemt. For eksempel i PrintStreamog BufferedReader.

Hvis vi gør alt det, vil vores kode se sådan ud:

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å at arbejde med netværket

Lad os downloade noget fra internettet. Og ikke bare downloade det, men gem det på disken.

Lad os f.eks. skrive et program, der gemmer et billede fra Googles hjemmeside til disk.

I princippet er der ikke noget kompliceret her. I sin enkleste form ville denne kode se sådan ud:

Gemmer en fil på disken
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 hjælp af de første tre linjer modtager vi en datastrøm fra en internetressource - fra et billede.

I den fjerde linje opretter vi navnet på den fil, som vi vil gemme billedet til. Navnet kan være hvad som helst, men filtypenavnet skal svare til filtypenavnet på billedet på internettet. Det vil tillade lokale billedfremvisere at åbne det korrekt.

Og endelig er den sidste linje en af Files​​klassens copymetoder. Klassen Fileshar flere af dem. Denne metode, som vi brugte, tager en bytestrøm ( InputStream) som dens første parameter, og som den anden parameter - navnet på den fil, hvor dataene skal skrives.

Teoretisk set, hvis URLbilledet var kort, så kunne denne kode endda skrives på en enkelt linje:

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

Du behøver selvfølgelig ikke skrive det sådan her, men dette eksempel viser, hvor praktiske og kraftfulde I/O-streams er i Java.