1. URLosztály

Tanulmányoztuk az I/O adatfolyamokkal való munkát. Tanulmányoztuk a fájlokkal való munkát. Mit tanuljunk ezután? Mi a helyzet a hálózattal, beleértve az internetet is? Ígéretesnek hangzik, nem?

A Java nyelven az internettel való munka nem nehezebb, mint a fájlokkal. Nos, talán csak egy kicsit.

Az internetes erőforrásokkal való munkához a Java speciális osztálya - URL. Ez olyan egyszerű, mint egy zsámoly, ahogy most látni fogja.

Weboldal beszerzése

Mit gondol, hány sornyi kódot kell megírnia ahhoz, hogy letölthessen valamilyen szöveges fájlt az internetről, és megjelenítse a tartalmát a képernyőn? 10? 100? 1000? Vagy esetleg 5?

Kód jegyzet
URL url = new URL("https://codegym.cc");
InputStream input = url.openStream();
byte[] buffer = input.readAllBytes();
String str = new String(buffer);
System.out.println(str);
Létrehoz egy URL objektumot az oldal elérési útjával
Lekér egy InputStreamURL objektumot
Beolvassa az összes bájtot és egy bájtos tömböt ad vissza
A tömb átalakítása stringgé
A karakterlánc megjelenítése

Egy HTML-fájl tartalma megjelenik a képernyőn:

Konzol kimenet
<!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″>
    ...

FileA és aURL

URLhasonló a Filevagy -hoz Path, de Patheltárolja egy erőforrás elérési útját a fájlrendszerben, és URLtárolja egy erőforrás elérési útját az interneten.

InputStreamMinden varázslat megtörténik, amikor a metódus egyetlen meghívásának köszönhetően kapunk egy tárgyat openStream(). Ez egy közönséges tárgy, és már kívül-belül tanulmányoztuk. Minden nyilvánvalóvá válik, miután megkaptuk a InputStreamtárgyat. Hiszen már tudjuk, hogyan lehet adatot szerezni belőle.

Nézze meg: csak az első két sor különbözik, és csak kissé. És most már láthatja – a szabványosítás és az adatfolyam-láncokkal való munka előnye:

Internetes munka Fájlokkal végzett munka
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. URLConnectionosztály

Amellett, hogy egyszerűen leolvassuk az adatokat az internetről, adatokat is feltölthetünk. Az adatok feltöltése sokkal bonyolultabb, mint az olvasás. Szüksége lesz még néhány módszerre. Például:

Kód jegyzet
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
Hozzon létre egy URL objektumot az oldal elérési útjával
Kétirányú kapcsolat létrehozása Kimeneti


adatfolyam
beszerzése Adatok


elhelyezése Bemeneti
adatfolyam olvasása belőle

Jegyezzük meg, hogy itt már nem hívjuk a url.openStream()módszert. Ehelyett egy hosszabb utat választunk:

  • URLConnection.openConnection()A módszerrel először stabil kétirányú kapcsolatot hozunk létre
  • Ezután egy adatfolyamot kapunk, amely a metódussal adatokat küld connection.getOutputStream(), és adatokat küld a szervernek
  • Ezután a metódussal kapunk egy adatfolyamot az adatok olvasásához connection.getInputStream(), és abból kezdjük el az adatolvasást.

Erőforrás menedzsment

Szigorúan véve minden folyamot egy blokkba kell csomagolnunk try-with-resourcesa biztonságos kezelés érdekében. És nem ártana becsomagolni a csupasz InputStreamés OutputStreamvalami kényelmesebb dologba. Például a PrintStreamés BufferedReader.

Ha mindezt megtesszük, akkor a kódunk valahogy így fog kinézni:

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. Példák a hálózattal való munkára

Töltsünk le valamit az internetről. És ne csak töltse le, hanem mentse lemezre.

Például írjunk egy programot, amely a Google kezdőlapjáról egy képet lemezre ment.

Elvileg nincs itt semmi bonyolult. A legegyszerűbb formában ez a kód így nézne ki:

Fájl mentése lemezre
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);

Az első három sor segítségével adatfolyamot kapunk egy internetes forrásból — képből.

A negyedik sorban létrehozzuk annak a fájlnak a nevét, amelybe a képet menteni fogjuk. A név bármi lehet, de a fájl kiterjesztésének meg kell egyeznie az interneten található kép kiterjesztésével. Ez lehetővé teszi a helyi képnézők számára, hogy megfelelően nyissa meg.

FilesÉs végül, az utolsó sor az osztály egyik copymetódusa. Az Filesosztályban több is van. Ez az általunk használt módszer egy bájtfolyamot ( InputStream) vesz első paraméterként, második paraméterként pedig annak a fájlnak a nevét, ahová az adatokat írjuk.

Elméletileg, ha a URLkép rövid lenne, akkor ez a kód akár egyetlen sorba is írható:

Adatok másolása adatfolyamból fájlba
Files.copy(
   new URL("https://www.google.com/logo.png").openStream(),
   Path.of("c:\\GoogleLogo.png")
);

Természetesen nem kell így írni, de ez a példa bemutatja, milyen kényelmes és hatékony az I/O adatfolyamok Java-ban.