1. URLkelas

Kami telah mempelajari cara bekerja dengan aliran I/O. Kami telah mempelajari bekerja dengan file. Apa yang harus kita pelajari selanjutnya? Bagaimana dengan bekerja dengan jaringan, termasuk Internet? Kedengarannya menjanjikan, bukan?

Di Jawa, bekerja dengan Internet tidak lebih sulit daripada bekerja dengan file. Yah, mungkin hanya sedikit.

Untuk bekerja dengan sumber daya Internet, Java memiliki kelas khusus — URL. Ini sesederhana bangku, seperti yang akan Anda lihat sekarang.

Mendapatkan halaman web

Menurut Anda, berapa baris kode yang perlu Anda tulis untuk mengunduh beberapa file teks dari Internet dan menampilkan kontennya di layar? 10? 100? 1000? Atau mungkin 5?

Kode 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);
Membuat objek URL dengan jalur ke halaman
Mengambil InputStreamdari objek URL
Membaca semua byte dan mengembalikan array byte
Mengubah array menjadi string
Menampilkan string

Konten file HTML akan ditampilkan di layar:

Keluaran 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

URLmirip dengan Fileor Path, tetapi Pathmenyimpan jalur ke sumber daya di sistem file, dan URLmenyimpan jalur ke sumber daya di Internet.

Semua keajaiban terjadi saat kita mendapatkan InputStreamobjek berkat satu panggilan ke openStream()metode. Ini adalah objek biasa, dan kami telah mempelajarinya luar dalam. Semuanya menjadi jelas setelah kita mendapatkan objeknya InputStream. Bagaimanapun, kita sudah tahu cara mendapatkan data darinya.

Coba lihat: hanya dua baris pertama yang berbeda, dan hanya sedikit. Dan sekarang Anda bisa melihatnya — keuntungan dari standardisasi dan bekerja dengan rangkaian aliran data:

Bekerja dengan Internet Bekerja dengan file
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 sekadar membaca data dari internet, kita juga bisa mengunggah data. Mengunggah data jauh lebih rumit daripada membacanya. Anda akan memerlukan beberapa metode lagi. Misalnya:

Kode 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
Buat objek URL dengan jalur ke halaman
Buat koneksi dua arah


Dapatkan aliran keluaran
Masukkan data ke dalamnya


Dapatkan aliran masukan
Baca data darinya

Perhatikan bahwa kami tidak lagi memanggil url.openStream()metode di sini. Sebagai gantinya, kami mengambil rute yang lebih panjang:

  • Kami pertama-tama membuat koneksi dua arah yang stabil menggunakan URLConnection.openConnection()metode ini
  • Kemudian kami mendapatkan aliran untuk mengirim data menggunakan connection.getOutputStream()metode dan mengirim data ke server
  • Kemudian kami mendapatkan aliran untuk membaca data menggunakan connection.getInputStream()metode tersebut dan mulai membaca data darinya.

Pengelolaan sumber daya

Sebenarnya, kita harus membungkus semua aliran dalam satu try-with-resourcesblok untuk penanganan yang aman. Dan tidak ada salahnya untuk membungkus yang telanjang InputStreamdan OutputStreamdengan sesuatu yang lebih nyaman. Misalnya dalam PrintStreamdan BufferedReader.

Jika kita melakukan semua itu, maka kode kita akan terlihat 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 jaringan

Ayo unduh sesuatu dari Internet. Dan tidak hanya mengunduhnya, tetapi menyimpannya ke disk.

Misalnya, mari kita menulis program yang menyimpan gambar dari beranda Google ke disk.

Prinsipnya, tidak ada yang rumit di sini. Dalam bentuknya yang paling sederhana, kode ini akan terlihat seperti ini:

Menyimpan file ke disk
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 dari sumber daya Internet — dari gambar.

Di baris keempat, kami membuat nama file tempat kami akan menyimpan gambar. Namanya bisa apa saja, tetapi ekstensi file harus sesuai dengan ekstensi gambar di Internet. Itu akan memungkinkan pemirsa gambar lokal untuk membukanya dengan benar.

Dan terakhir, baris terakhir adalah salah satu metode Fileskelas copy. Kelas Filesmemiliki beberapa dari mereka. Metode ini, yang kami gunakan, menggunakan aliran byte ( InputStream) sebagai parameter pertamanya, dan sebagai parameter kedua — nama file tempat data harus ditulis.

Secara teoritis, jika gambarnya URLpendek, maka kode ini bahkan dapat ditulis dalam satu baris:

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

Tentu saja, Anda tidak harus menulisnya seperti ini, tetapi contoh ini menunjukkan betapa mudah dan kuatnya aliran I/O di Java.