1. URLclasa

Am studiat lucrul cu fluxurile I/O. Am studiat lucrul cu fișierele. Ce ar trebui să studiem în continuare? Ce zici de lucrul cu rețeaua, inclusiv cu internetul? Sună promițător, nu-i așa?

În Java, lucrul cu Internetul nu este mai dificil decât lucrul cu fișiere. Ei bine, poate doar un pic.

Pentru a lucra cu resurse de Internet, Java are o clasă specială — URL. Este la fel de simplu ca un scaun, după cum veți vedea acum.

Obținerea unei pagini web

Câte linii de cod credeți că trebuie să scrieți pentru a descărca un fișier text de pe Internet și a afișa conținutul acestuia pe ecran? 10? 100? 1000? Sau poate 5?

Cod Notă
URL url = new URL("https://codegym.cc");
InputStream input = url.openStream();
byte[] buffer = input.readAllBytes();
String str = new String(buffer);
System.out.println(str);
Creează un obiect URL cu calea către pagină
Obține un InputStreamde la obiectul URL
Citește toți octeții și returnează o matrice de octeți
Convertește matricea într-un șir
Afișează șirul

Conținutul unui fișier HTML va fi afișat pe ecran:

Ieșire de consolă
<!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″>
    ...

Comparând lucrul cu FileșiURL

URLeste similar cu Filesau Path, dar Pathstochează calea către o resursă în sistemul de fișiere și URLstochează calea către o resursă pe Internet.

Toată magia se întâmplă atunci când obținem un InputStreamobiect datorită unui singur apel la openStream()metodă. Acesta este un obiect obișnuit și l-am studiat deja în interior și în exterior. Totul devine evident după ce primim obiectul InputStream. La urma urmei, știm deja cum să obținem date din el.

Aruncă o privire: doar primele două rânduri sunt diferite și doar puțin. Și acum îl puteți vedea - avantajul standardizării și al lucrului cu lanțuri de fluxuri de date:

Lucrul cu Internetul Lucrul cu un fișier
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. URLConnectionclasa

Pe lângă pur și simplu citirea datelor de pe Internet, putem și încărca date. Încărcarea datelor este mult mai complicată decât citirea acestora. Veți avea nevoie de încă câteva metode. De exemplu:

Cod Notă
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
Creați un obiect URL cu calea către pagină
Creați o conexiune bidirecțională


Obțineți un flux de ieșire
Puneți date în el


Obțineți un flux de intrare
Citiți datele din acesta

Rețineți că nu mai numim url.openStream()metoda aici. În schimb, luăm un traseu mai lung:

  • Mai întâi stabilim o conexiune bidirecțională stabilă folosind URLConnection.openConnection()metoda
  • Apoi obținem un flux pentru a trimite date folosind connection.getOutputStream()metoda și a trimite date către server
  • Apoi obținem un flux pentru citirea datelor folosind connection.getInputStream()metoda și începem să citim datele din acesta.

Managementul resurselor

Strict vorbind, ar trebui să înfășurăm toate fluxurile într-un try-with-resourcesbloc pentru o manipulare în siguranță. Și n-ar strica să înfășurați golul InputStreamși OutputStreamîn ceva mai convenabil. De exemplu, în PrintStreamși BufferedReader.

Dacă facem toate acestea, atunci codul nostru va arăta cam așa:

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. Exemple de lucru cu rețeaua

Să descarcăm ceva de pe Internet. Și nu doar descărcați-l, ci salvați-l pe disc.

De exemplu, să scriem un program care salvează pe disc o imagine de pe pagina de pornire Google.

În principiu, nu este nimic complicat aici. În forma sa cea mai simplă, acest cod ar arăta astfel:

Salvarea unui fișier pe disc
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);

Cu ajutorul primelor trei linii, primim un flux de date de la o resursă de Internet - dintr-o imagine.

În a patra linie, creăm numele fișierului în care vom salva imaginea. Numele poate fi orice, dar extensia fișierului trebuie să se potrivească cu extensia imaginii de pe Internet. Acest lucru va permite vizualizatorilor locali de imagini să o deschidă corect.

Și, în sfârșit, ultima linie este una dintre metodele Filesclasei copy. Clasa Filesare mai multe dintre ele. Această metodă, pe care am folosit-o, ia un flux de octeți ( InputStream) ca prim parametru și ca al doilea parametru - numele fișierului în care ar trebui să fie scrise datele.

Teoretic, dacă URLimaginea ar fi scurtă, atunci acest cod ar putea fi chiar scris într-o singură linie:

Copierea datelor dintr-un flux într-un fișier
Files.copy(
   new URL("https://www.google.com/logo.png").openStream(),
   Path.of("c:\\GoogleLogo.png")
);

Desigur, nu trebuie să scrieți așa, dar acest exemplu demonstrează cât de convenabile și puternice sunt fluxurile I/O în Java.