1. URLklasse

We hebben het werken met I/O-streams bestudeerd. We hebben het werken met bestanden bestudeerd. Wat moeten we hierna bestuderen? Hoe zit het met het werken met het netwerk, inclusief internet? Klinkt veelbelovend, niet?

In Java is werken met internet niet moeilijker dan werken met bestanden. Nou ja, misschien maar een klein beetje.

Om met internetbronnen te werken, heeft Java een speciale klasse — URL. Het is zo simpel als een kruk, zoals je nu zult zien.

Een webpagina krijgen

Hoeveel regels code denkt u te moeten schrijven om een ​​tekstbestand van internet te downloaden en de inhoud ervan op het scherm weer te geven? 10? 100? 1000? Of misschien wel 5?

Code Opmerking
URL url = new URL("https://codegym.cc");
InputStream input = url.openStream();
byte[] buffer = input.readAllBytes();
String str = new String(buffer);
System.out.println(str);
Creëert een URL-object met het pad naar de pagina
Haalt een InputStreamuit het URL-object
Leest alle bytes en retourneert een array van bytes
Zet de array om in een string
Geef de string weer

De inhoud van een HTML-bestand wordt op het scherm weergegeven:

Console-uitvoer
<!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″>
    ...

Werken vergelijken met FileenURL

URLis vergelijkbaar met Fileof Path, maar Pathslaat het pad naar een bron op in het bestandssysteem en URLslaat het pad op naar een bron op internet.

Alle magie gebeurt wanneer we een InputStreamobject krijgen dankzij een enkele aanroep van de openStream()methode. Dit is een gewoon object en we hebben het al van binnen en van buiten bestudeerd. Alles wordt duidelijk nadat we het InputStreamobject hebben gekregen. We weten immers al hoe we er gegevens uit kunnen halen.

Kijk maar: alleen de eerste twee regels zijn verschillend, en slechts in geringe mate. En nu zie je het — het voordeel van standaardisatie en werken met ketens van datastromen:

Werken met internet Werken met een bestand
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

Naast het simpelweg uitlezen van gegevens van internet, kunnen we ook gegevens uploaden. Het uploaden van gegevens is veel ingewikkelder dan het lezen ervan. Je hebt nog een paar methoden nodig. Bijvoorbeeld:

Code Opmerking
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
Maak een URL-object met het pad naar de pagina
Maak een tweerichtingsverbinding


Haal een uitvoerstroom
op Zet er gegevens in


Krijg een invoerstroom
Lees er gegevens uit

Merk op dat we de methode hier niet meer aanroepen url.openStream(). In plaats daarvan nemen we een langere route:

  • URLConnection.openConnection()Met de methode brengen we eerst een stabiele tweerichtingsverbinding tot stand
  • Vervolgens krijgen we een stream om gegevens te verzenden met behulp van de connection.getOutputStream()methode en gegevens naar de server te sturen
  • Vervolgens krijgen we een stroom voor het lezen van gegevens met behulp van de connection.getInputStream()methode en beginnen we er gegevens uit te lezen.

Middelenbeheer

Strikt genomen moeten we alle stromen in een try-with-resourcesblok wikkelen voor een veilige afhandeling. En het zou geen kwaad om de blote InputStreamen OutputStreamin iets handiger te wikkelen. Bijvoorbeeld in PrintStreamen BufferedReader.

Als we dat allemaal doen, ziet onze code er ongeveer zo uit:

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. Voorbeelden van werken met het netwerk

Laten we iets van internet downloaden. En niet alleen downloaden, maar opslaan op schijf.

Laten we bijvoorbeeld een programma schrijven dat een afbeelding van de startpagina van Google op schijf opslaat.

In principe is hier niets ingewikkelds. In zijn eenvoudigste vorm ziet deze code er als volgt uit:

Een bestand opslaan op schijf
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);

Met behulp van de eerste drie regels ontvangen we een gegevensstroom van een internetbron - van een afbeelding.

In de vierde regel maken we de naam van het bestand waarin we de afbeelding zullen opslaan. De naam kan van alles zijn, maar de bestandsextensie moet overeenkomen met de extensie van de afbeelding op internet. Dat stelt lokale afbeeldingsviewers in staat om het correct te openen.

En tot slot is de laatste regel een van de methoden Filesvan de klasse copy. De Filesklas heeft er meerdere. Deze methode, die we hebben gebruikt, neemt een bytestroom ( InputStream) als eerste parameter en als tweede parameter — de naam van het bestand waar de gegevens naartoe moeten worden geschreven.

Theoretisch, als de URLafbeelding kort zou zijn, zou deze code zelfs in één regel kunnen worden geschreven:

Gegevens kopiëren van een stream naar een bestand
Files.copy(
   new URL("https://www.google.com/logo.png").openStream(),
   Path.of("c:\\GoogleLogo.png")
);

Je hoeft het natuurlijk niet zo te schrijven, maar dit voorbeeld laat zien hoe handig en krachtig I/O-streams zijn in Java.