1. URLKlasse

Wir haben die Arbeit mit I/O-Streams untersucht. Wir haben den Umgang mit Dateien studiert. Was sollen wir als nächstes studieren? Wie sieht es mit der Arbeit mit dem Netzwerk, einschließlich dem Internet, aus? Klingt vielversprechend, nicht wahr?

In Java ist die Arbeit mit dem Internet nicht schwieriger als die Arbeit mit Dateien. Na ja, vielleicht nur ein bisschen.

Um mit Internetressourcen zu arbeiten, verfügt Java über eine spezielle Klasse – URL. Es ist so einfach wie ein Hocker, wie Sie jetzt sehen werden.

Eine Webseite bekommen

Wie viele Zeilen Code müssen Sie Ihrer Meinung nach schreiben, um eine Textdatei aus dem Internet herunterzuladen und deren Inhalt auf dem Bildschirm anzuzeigen? 10? 100? 1000? Oder vielleicht 5?

Code Notiz
URL url = new URL("https://codegym.cc");
InputStream input = url.openStream();
byte[] buffer = input.readAllBytes();
String str = new String(buffer);
System.out.println(str);
Erstellt ein URL-Objekt mit dem Pfad zur Seite.
Ruft ein InputStreamURL-Objekt ab.
Liest alle Bytes und gibt ein Byte-Array zurück.
Konvertiert das Array in eine Zeichenfolge
. Zeigt die Zeichenfolge an

Der Inhalt einer HTML-Datei wird auf dem Bildschirm angezeigt:

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

Vergleich der Arbeit mit FileundURL

URLähnelt Fileor Path, speichert jedoch Pathden Pfad zu einer Ressource im Dateisystem und URLspeichert den Pfad zu einer Ressource im Internet.

InputStreamDie ganze Magie geschieht, wenn wir dank eines einzigen Aufrufs der Methode ein Objekt erhalten openStream(). Dies ist ein gewöhnliches Objekt, und wir haben es bereits von innen und außen untersucht. Alles wird offensichtlich, nachdem wir das InputStreamObjekt erhalten haben. Schließlich wissen wir bereits, wie wir daraus Daten gewinnen.

Schauen Sie mal: Nur die ersten beiden Zeilen unterscheiden sich, und zwar nur geringfügig. Und jetzt können Sie es sehen – den Vorteil der Standardisierung und der Arbeit mit Ketten von Datenströmen:

Arbeiten mit dem Internet Arbeiten mit einer Datei
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

Neben dem einfachen Auslesen von Daten aus dem Internet können wir auch Daten hochladen. Das Hochladen von Daten ist viel komplizierter als das Lesen. Sie werden noch ein paar weitere Methoden benötigen. Zum Beispiel:

Code Notiz
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
Erstellen Sie ein URL-Objekt mit dem Pfad zur Seite.
Erstellen Sie eine bidirektionale Verbindung.


Erhalten Sie einen Ausgabestream.
Fügen Sie Daten darin ein.


Erhalten Sie einen Eingabestream.
Lesen Sie Daten daraus

Beachten Sie, dass wir die Methode hier nicht mehr aufrufen url.openStream(). Stattdessen gehen wir einen längeren Weg:

  • URLConnection.openConnection()Mit dieser Methode stellen wir zunächst eine stabile Zwei-Wege-Verbindung her
  • Dann erhalten wir einen Stream, um Daten mithilfe der connection.getOutputStream()Methode zu senden und Daten an den Server zu senden
  • Dann erhalten wir einen Stream zum Lesen von Daten mithilfe der connection.getInputStream()Methode und beginnen mit dem Lesen von Daten daraus.

Resourcenmanagement

Streng genommen sollten wir alle Streams try-with-resourceszur sicheren Handhabung in einen Block einschließen. InputStreamUnd es würde nicht schaden, das Nackte OutputStreamin etwas Bequemeres einzuwickeln . Zum Beispiel in PrintStreamund BufferedReader.

Wenn wir das alles tun, sieht unser Code etwa so aus:

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. Beispiele für die Arbeit mit dem Netzwerk

Lasst uns etwas aus dem Internet herunterladen. Und laden Sie es nicht einfach herunter, sondern speichern Sie es auf der Festplatte.

Schreiben wir beispielsweise ein Programm, das ein Bild von der Google-Startseite auf der Festplatte speichert.

Im Prinzip gibt es hier nichts Kompliziertes. In seiner einfachsten Form würde dieser Code so aussehen:

Eine Datei auf der Festplatte speichern
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);

Mit Hilfe der ersten drei Zeilen erhalten wir einen Datenstrom von einer Internetressource – von einem Bild.

In der vierten Zeile erstellen wir den Namen der Datei, in der wir das Bild speichern. Der Name kann beliebig sein, die Dateierweiterung muss jedoch mit der Erweiterung des Bildes im Internet übereinstimmen. Dadurch können lokale Bildbetrachter es korrekt öffnen.

Und schließlich ist die letzte Zeile eine der Methoden Filesder Klasse copy. Die FilesKlasse hat mehrere davon. InputStreamDiese von uns verwendete Methode verwendet als ersten Parameter einen Bytestream ( ) und als zweiten Parameter den Namen der Datei, in die die Daten geschrieben werden sollen.

Wenn das URLBild kurz wäre, könnte dieser Code theoretisch sogar in einer einzigen Zeile geschrieben werden:

Kopieren von Daten aus einem Stream in eine Datei
Files.copy(
   new URL("https://www.google.com/logo.png").openStream(),
   Path.of("c:\\GoogleLogo.png")
);

Natürlich müssen Sie es nicht so schreiben, aber dieses Beispiel zeigt, wie praktisch und leistungsfähig I/O-Streams in Java sind.