1. URLkelas

Kami telah belajar bekerja dengan aliran I/O. Kami telah belajar bekerja dengan fail. Apa yang patut kita kaji seterusnya? Bagaimana pula dengan bekerja dengan rangkaian, termasuk Internet? Bunyi menjanjikan, bukan?

Di Java, bekerja dengan Internet tidak lebih sukar daripada bekerja dengan fail. Nah, mungkin hanya sedikit.

Untuk bekerja dengan sumber Internet, Java mempunyai kelas khas — URL. Ia semudah najis, seperti yang anda akan lihat sekarang.

Mendapatkan halaman web

Berapa banyak baris kod yang anda fikir anda perlu tulis untuk memuat turun beberapa fail teks dari Internet dan memaparkan kandungannya pada skrin? 10? 100? 1000? Atau mungkin 5?

Kod Catatan
URL url = new URL("https://codegym.cc");
InputStream input = url.openStream();
byte[] buffer = input.readAllBytes();
String str = new String(buffer);
System.out.println(str);
Mencipta objek URL dengan laluan ke halaman
Mendapatkan InputStreamdaripada objek URL
Membaca semua bait dan mengembalikan tatasusunan bait
Menukar tatasusunan kepada rentetan
Paparkan rentetan

Kandungan fail HTML akan dipaparkan pada skrin:

Output konsol
<!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″>
    ...

Membandingkan bekerja dengan FiledanURL

URLadalah serupa dengan Fileatau Path, tetapi Pathmenyimpan laluan ke sumber dalam sistem fail dan URLmenyimpan laluan ke sumber di Internet.

Semua keajaiban berlaku apabila kita mendapat InputStreamobjek terima kasih kepada satu panggilan ke openStream()kaedah tersebut. Ini adalah objek biasa, dan kami telah mengkajinya di dalam dan luar. Segala-galanya menjadi jelas selepas kita mendapat InputStreamobjek. Lagipun, kita sudah tahu bagaimana untuk mendapatkan data daripadanya.

Sila lihat: hanya dua baris pertama berbeza, dan hanya sedikit. Dan kini anda boleh melihatnya — kelebihan penyeragaman dan bekerja dengan rangkaian aliran data:

Bekerja dengan Internet Bekerja dengan fail
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. URLConnectionkelas

Selain hanya membaca data dari Internet, kita juga boleh memuat naik data. Memuat naik data adalah lebih rumit daripada membacanya. Anda akan memerlukan beberapa kaedah lagi. Sebagai contoh:

Kod Catatan
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
Cipta objek URL dengan laluan ke halaman
Cipta sambungan dua hala


Dapatkan aliran output
Letakkan data di dalamnya


Dapatkan aliran input
Baca data daripadanya

Ambil perhatian bahawa kami tidak lagi memanggil url.openStream()kaedah di sini. Sebaliknya, kami mengambil laluan yang lebih panjang:

  • Kami mula-mula mewujudkan sambungan dua hala yang stabil menggunakan URLConnection.openConnection()kaedah tersebut
  • Kemudian kami mendapat aliran untuk menghantar data menggunakan connection.getOutputStream()kaedah dan menghantar data ke pelayan
  • Kemudian kami mendapat aliran untuk membaca data menggunakan connection.getInputStream()kaedah dan mula membaca data daripadanya.

Pengurusan sumber

Tegasnya, kita harus membalut semua aliran dalam satu try-with-resourcesblok untuk pengendalian yang selamat. Dan tidak rugi untuk membungkus yang terdedah InputStreamdan OutputStreamdalam sesuatu yang lebih mudah. Contohnya, dalam PrintStreamdan BufferedReader.

Jika kita melakukan semua itu, maka kod kita akan kelihatan seperti ini:

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. Contoh bekerja dengan rangkaian

Mari muat turun sesuatu daripada Internet. Dan bukan sahaja memuat turunnya, tetapi menyimpannya ke cakera.

Sebagai contoh, mari tulis program yang menyimpan imej dari halaman utama Google ke cakera.

Pada dasarnya, tidak ada yang rumit di sini. Dalam bentuk yang paling mudah, kod ini akan kelihatan seperti ini:

Menyimpan fail ke cakera
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);

Dengan bantuan tiga baris pertama, kami menerima aliran data daripada sumber Internet — daripada gambar.

Dalam baris keempat, kami mencipta nama fail yang akan kami simpan imej. Nama boleh apa-apa, tetapi sambungan fail mesti sepadan dengan sambungan gambar di Internet. Itu akan membolehkan penonton imej tempatan membukanya dengan betul.

Dan akhirnya, baris terakhir adalah salah satu kaedah Fileskelas copy. Kelas Filesmempunyai beberapa daripadanya. Kaedah ini, yang kami gunakan, mengambil aliran bait ( InputStream) sebagai parameter pertamanya, dan sebagai parameter kedua — nama fail tempat data harus ditulis.

Secara teorinya, jika URLimej itu pendek, maka kod ini juga boleh ditulis dalam satu baris:

Menyalin data daripada aliran ke fail
Files.copy(
   new URL("https://www.google.com/logo.png").openStream(),
   Path.of("c:\\GoogleLogo.png")
);

Sudah tentu, anda tidak perlu menulisnya seperti ini, tetapi contoh ini menunjukkan betapa mudah dan berkuasa aliran I/O di Jawa.