JavaRush /Java Blog /Random-ID /Untuk apa kelas PrintStream?

Untuk apa kelas PrintStream?

Dipublikasikan di grup Random-ID
Halo! Hari ini kita akan membicarakan tentang kelas PrintStreamdan segala hal yang dapat dilakukannya. Untuk apa kelas PrintStream - 1Sebenarnya Anda sudah familiar dengan dua metode kelas PrintStream. Ini adalah metode print()dan println()yang mungkin Anda gunakan setiap hari :) Karena variabel System.outadalah objek PrintStream, saat Anda memanggil metode System.out.println(), Anda memanggil metode dari kelas tertentu. Tujuan umum kelas PrintStreamadalah untuk mengeluarkan informasi ke aliran tertentu. Kelas ini memiliki beberapa konstruktor. Berikut ini beberapa yang paling umum:
  • PrintStream(OutputStream outputStream)
  • PrintStream(File outputFile) throws FileNotFoundException
  • PrintStream(String outputFileName) throws FileNotFoundException
Seperti yang Anda lihat, kita dapat meneruskan ke konstruktor objek PrintStream, misalnya, nama file yang ingin kita keluarkan datanya. Atau, alternatifnya, objek itu sendiri File. Mari kita lihat cara kerjanya dengan contoh:
import java.io.File;
import java.io.FileNotFoundException;
import java.io.PrintStream;

public class Main {

   public static void main(String arr[]) throws FileNotFoundException
   {
       PrintStream filePrintStream = new PrintStream(new File("C:\\Users\\Username\\Desktop\\test.txt"));

       filePrintStream.println(222);
       filePrintStream.println("Hello world");
       filePrintStream.println(false);
   }
}
Kode ini akan membuat file di desktop test.txt(jika belum ada di sana) dan menulis nomor, string, dan boolean-variabel kita di sana secara berurutan. Berikut isi file kita setelah program dijalankan:

222
Hello world!
false
Seperti yang kami katakan di atas, tidak perlu meneruskan objek file itu sendiri File. Anda hanya perlu menentukan jalurnya di konstruktor:
import java.io.FileNotFoundException;
import java.io.PrintStream;

public class Main {

   public static void main(String arr[]) throws FileNotFoundException
   {
       PrintStream filePrintStream = new PrintStream("C:\\Users\\Username\\Desktop\\test.txt");

       filePrintStream.println(222);
       filePrintStream.println("Hello world");
       filePrintStream.println(false);
   }
}
Kode ini akan melakukan hal yang sama seperti yang sebelumnya. Metode lain yang menarik untuk dilihat adalah , printf()atau keluaran string yang diformat. Apa yang dimaksud dengan "string yang diformat"? Untuk menjelaskannya, saya akan memberikan contoh:
import java.io.IOException;
import java.io.PrintStream;

public class Main {

   public static void main(String[] args) throws IOException {

       PrintStream printStream = new PrintStream("C:\\Users\\Евгений\\Desktop\\test.txt");

       printStream.println("Hello!");
       printStream.println("I'm robot!");

       printStream.printf("My name is %s, my age is %d!", "Amigo", 18);

       printStream.close();

   }
}
Di sini, alih-alih secara eksplisit menuliskan nama dan usia robot kita dalam satu baris, kita sepertinya menyisakan “ruang kosong” untuk informasi ini menggunakan pointer %sdan %d. Dan kami meneruskan data yang seharusnya ada di tempat ini sebagai parameter. Dalam kasus kita, ini adalah string " Amigo " dan angka 18. Kita dapat, misalnya, membuat spasi lain: katakanlah,, %bdan meneruskan parameter lain. Untuk apa? Pertama-tama, untuk meningkatkan fleksibilitas. Jika program Anda perlu sering menampilkan pesan selamat datang, Anda harus memasukkan teks yang diperlukan secara manual untuk setiap robot baru. Anda bahkan tidak akan dapat memasukkan teks ini ke dalam konstanta: nama dan usia setiap orang berbeda! Tetapi dengan menggunakan metode baru, Anda dapat menampilkan string dengan salam ke konstanta, dan jika perlu, cukup ubah parameter dalam metode tersebut printf().
import java.io.IOException;
import java.io.PrintStream;

public class Main {

   private static final String GREETINGS_MESSAGE = "My name is %s, my age is %d!";

   public static void main(String[] args) throws IOException {

       PrintStream printStream = new PrintStream("C:\\Users\\Евгений\\Desktop\\test.txt");

       printStream.println("Hello!");
       printStream.println("We are robots!");

       printStream.printf(GREETINGS_MESSAGE, "Amigo", 18);
       printStream.printf(GREETINGS_MESSAGE, "R2-D2", 35);
       printStream.printf(GREETINGS_MESSAGE, "C-3PO", 35);

       printStream.close();
   }
}

Sistem.dalam spoofing

Dalam kuliah ini kita akan “melawan sistem” dan mempelajari cara mengganti variabel System.indan mengarahkan keluaran sistem ke tempat yang kita butuhkan. Untuk apa kelas PrintStream? - 2Anda mungkin lupa apa itu System.in, tapi tidak ada pelajar JavaRush yang akan melupakan konstruksi ini:
BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
System.in(seperti System.out) adalah variabel kelas statis System. Namun, berbeda dengan System.out, ia termasuk dalam kelas yang berbeda, yaitu InputStream. Secara default System.in, ini adalah thread yang membaca data dari perangkat sistem—keyboard. Namun, seperti halnya System.out, kita dapat mengganti sumber datanya, dan pembacaan tidak akan dilakukan dari keyboard, tetapi dari tempat yang kita perlukan! Mari kita lihat sebuah contoh:
import java.io.*;

public class Main {

   public static void main(String[] args) throws IOException {

       String greetings = "Hello! Меня зовут Амиго!\nЯ изучаю Java на сайте JavaRush.\nОднажды я стану крутым программистом!\n";
       byte[] bytes = greetings.getBytes();

       InputStream inputStream = new ByteArrayInputStream(bytes);

       System.setIn(inputStream);

       BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));

       String str;

       while ((str = reader.readLine())!= null) {

           System.out.println(str);
       }

   }
}
Jadi apa yang kita lakukan? Biasanya System.in“terikat” pada keyboard. Namun kami tidak ingin data dibaca dari keyboard: biarkan data dibaca dari baris teks biasa! Kami membuat string dan menerimanya sebagai array byte. Mengapa kita membutuhkan byte? Faktanya adalah bahwa ini InputStreamadalah kelas abstrak, dan kita tidak dapat membuat turunannya. Anda harus memilih beberapa kelas dari antara ahli warisnya. Sebagai contoh, kita dapat mengambil ByteArrayInputStream. Sederhana saja, dan dari namanya saja sudah jelas cara kerjanya: sumber datanya adalah array byte. Jadi kita membuat array byte yang sama dan meneruskannya ke konstruktor kita stream, yang akan membaca datanya. Faktanya, semuanya sudah siap! Sekarang kita hanya perlu menggunakan metode System.setIn()untuk menetapkan nilai variabel secara eksplisit in. Dalam kasus out, seperti yang Anda ingat, jelas tidak mungkin untuk menetapkan nilai variabel: Anda harus menggunakan metode khusus setOut(). Setelah kita menetapkan InputStreamvariabel yang kita buat System.in, kita perlu memeriksa apakah ide kita berhasil. Seorang teman lama akan membantu kami dalam hal ini - BufferedReader. Dalam situasi normal, kode ini akan menyebabkan konsol terbuka di Intellij IDea Anda, dan data yang Anda masukkan dari keyboard akan dibaca dari sana.
BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));

       String str;

       while ((str = reader.readLine())!= null) {

           System.out.println(str);
       }
Tetapi ketika Anda menjalankannya sekarang, Anda akan melihat bahwa teks kita dari program hanya akan dikeluarkan ke konsol, tidak akan ada pembacaan dari keyboard. Kami telah mengubah sumber data, sekarang bukan keyboard, tapi string kami! Ini sangat mudah dan sederhana :) Dalam kuliah hari ini kita berkenalan dengan kelas baru dan melihat “retasan” kecil baru untuk bekerja dengan I/O. Saatnya kembali ke mata kuliah dan menyelesaikan beberapa masalah :) Sampai jumpa di kuliah berikutnya!
Komentar
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION