1. URLclasse

Nous avons étudié le travail avec les flux d'E/S. Nous avons étudié le travail avec des fichiers. Que devrions-nous étudier ensuite ? Qu'en est-il de travailler avec le réseau, y compris Internet ? Cela semble prometteur, n'est-ce pas ?

En Java, travailler avec Internet n'est pas plus difficile que travailler avec des fichiers. Eh bien, peut-être juste un peu.

Pour travailler avec les ressources Internet, Java a une classe spéciale — URL. C'est aussi simple qu'un tabouret, comme vous le verrez maintenant.

Obtenir une page Web

Combien de lignes de code pensez-vous devoir écrire pour télécharger un fichier texte depuis Internet et afficher son contenu à l'écran ? dix? 100 ? 1000 ? Ou peut-être 5 ?

Code Note
URL url = new URL("https://codegym.cc");
InputStream input = url.openStream();
byte[] buffer = input.readAllBytes();
String str = new String(buffer);
System.out.println(str);
Crée un objet URL avec le chemin d'accès à la page
Obtient un InputStreamà partir de l'objet URL
Lit tous les octets et renvoie un tableau d'octets
Convertit le tableau en chaîne
Affiche la chaîne

Le contenu d'un fichier HTML s'affichera à l'écran :

Sortie console
<!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″>
    ...

Comparer le travail avec FileetURL

URLest similaire à Fileou Path, mais Pathstocke le chemin d'accès à une ressource dans le système de fichiers et URLstocke le chemin d'accès à une ressource sur Internet.

Toute la magie opère lorsque nous obtenons un InputStreamobjet grâce à un seul appel à la openStream()méthode. C'est un objet ordinaire, et nous l'avons déjà étudié de fond en comble. Tout devient évident après avoir récupéré l' InputStreamobjet. Après tout, nous savons déjà comment en extraire des données.

Regardez : seules les deux premières lignes sont différentes, et seulement légèrement. Et maintenant vous pouvez le voir - l'avantage de la standardisation et du travail avec des chaînes de flux de données :

Travailler avec Internet Travailler avec un fichier
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. URLConnectionclasse

En plus de simplement lire des données sur Internet, nous pouvons également télécharger des données. Télécharger des données est beaucoup plus compliqué que de les lire. Vous allez avoir besoin de quelques méthodes supplémentaires. Par exemple:

Code Note
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
Créer un objet URL avec le chemin d'accès à la page
Créer une connexion bidirectionnelle


Obtenir un flux de sortie
Mettre des données dedans


Obtenir un flux d'entrée
Lire des données à partir de celui-ci

Notez que nous n'appelons plus la url.openStream()méthode ici. Au lieu de cela, nous prenons un itinéraire plus long :

  • Nous établissons d'abord une connexion bidirectionnelle stable en utilisant la URLConnection.openConnection()méthode
  • Ensuite, nous obtenons un flux pour envoyer des données en utilisant la connection.getOutputStream()méthode et envoyer des données au serveur
  • Ensuite, nous obtenons un flux pour lire les données à l'aide de la connection.getInputStream()méthode et commençons à lire les données à partir de celui-ci.

La gestion des ressources

À proprement parler, nous devrions encapsuler tous les flux dans un try-with-resourcesbloc pour une manipulation en toute sécurité. Et cela ne ferait pas de mal d'envelopper le nu InputStreamet OutputStreamdans quelque chose de plus pratique. Par exemple, dans PrintStreamet BufferedReader.

Si nous faisons tout cela, alors notre code ressemblera à ceci :

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. Exemples de travail avec le réseau

Téléchargeons quelque chose à partir d'Internet. Et ne vous contentez pas de le télécharger, mais enregistrez-le sur le disque.

Par exemple, écrivons un programme qui enregistre une image de la page d'accueil de Google sur le disque.

En principe, il n'y a rien de compliqué ici. Dans sa forme la plus simple, ce code ressemblerait à ceci :

Enregistrer un fichier sur disque
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);

À l'aide des trois premières lignes, nous recevons un flux de données d'une ressource Internet - à partir d'une image.

Dans la quatrième ligne, nous créons le nom du fichier dans lequel nous allons enregistrer l'image. Le nom peut être n'importe quoi, mais l'extension du fichier doit correspondre à l'extension de l'image sur Internet. Cela permettra aux visionneuses d'images locales de l'ouvrir correctement.

Et enfin, la dernière ligne est l'une des méthodes Filesde la classe copy. La Filesclasse en compte plusieurs. Cette méthode, que nous avons utilisée, prend un flux d'octets ( InputStream) comme premier paramètre et comme deuxième paramètre — le nom du fichier dans lequel les données doivent être écrites.

Théoriquement, si le URLde l'image était court, alors ce code pourrait même être écrit en une seule ligne :

Copier des données d'un flux vers un fichier
Files.copy(
   new URL("https://www.google.com/logo.png").openStream(),
   Path.of("c:\\GoogleLogo.png")
);

Bien sûr, vous n'êtes pas obligé de l'écrire comme ça, mais cet exemple montre à quel point les flux d'E/S sont pratiques et puissants en Java.