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

Untuk apa kelas PrintStream?

Diterbitkan dalam kumpulan
hello! Hari ini kita akan bercakap tentang kelas PrintStreamdan semua yang boleh dilakukan. Untuk apa kelas PrintStream? - 1Sebenarnya, anda sudah biasa dengan dua kaedah kelas PrintStream. print()Ini adalah dan kaedah println()yang mungkin anda gunakan setiap hari :) Memandangkan pembolehubah System.outialah objek PrintStream, apabila anda memanggil kaedah System.out.println(), anda memanggil kaedah kelas tertentu ini. Tujuan umum kelas PrintStreamadalah untuk mengeluarkan maklumat kepada beberapa aliran. Kelas ini mempunyai beberapa pembina. Berikut adalah beberapa yang paling biasa:
  • PrintStream(OutputStream outputStream)
  • PrintStream(File outputFile) throws FileNotFoundException
  • PrintStream(String outputFileName) throws FileNotFoundException
Seperti yang anda lihat, kita boleh memasukkan ke dalam pembina object PrintStream, sebagai contoh, nama fail yang kita ingin keluarkan data. Atau, sebagai alternatif, objek itu sendiri File. Mari lihat bagaimana ini berfungsi 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);
   }
}
Kod ini akan mencipta fail pada desktop test.txt(jika ia belum wujud di sana) dan menulis nombor, rentetan dan boolean-pembolehubah kami di sana secara berurutan. Berikut ialah kandungan fail kami selepas program dijalankan:

222
Hello world!
false
Seperti yang kami katakan di atas, ia tidak perlu untuk lulus objek fail itu sendiri File. Anda hanya perlu menentukan laluan kepadanya dalam pembina:
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);
   }
}
Kod ini akan melakukan perkara yang sama seperti yang sebelumnya. Kaedah lain yang menarik untuk dilihat ialah , printf()atau output rentetan terformat. Apakah maksud "rentetan terformat"? Untuk menjelaskan, 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, bukannya menulis secara jelas nama dan umur robot kami dalam satu baris, kami nampaknya meninggalkan "ruang kosong" untuk maklumat ini menggunakan penunjuk %sdan %d. Dan kami menghantar data yang sepatutnya berada di tempat ini sebagai parameter. Dalam kes kami, ini ialah rentetan " Amigo " dan nombor 18. Kita boleh, sebagai contoh, mencipta ruang lain: katakan, %b, dan lulus parameter lain. Untuk apa itu? Pertama sekali, untuk meningkatkan fleksibiliti. Jika program anda perlu kerap memaparkan mesej alu-aluan, anda perlu memasukkan teks yang diperlukan secara manual untuk setiap robot baharu. Anda tidak akan dapat meletakkan teks ini menjadi pemalar: nama dan umur setiap orang adalah berbeza! Tetapi menggunakan kaedah baharu, anda boleh mengeluarkan rentetan dengan ucapan kepada pemalar, dan jika perlu, cuma tukar parameter dalam kaedah 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 belajar bagaimana untuk menggantikan pembolehubah System.indan mengalihkan output sistem ke tempat yang kita perlukan. Apakah kelas PrintStream untuk - 2Anda mungkin terlupa apa itu System.in, tetapi tiada pelajar JavaRush akan melupakan pembinaan ini:
BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
System.in(seperti System.out) ialah pembolehubah kelas statik System. Tetapi, tidak seperti System.out, ia tergolong dalam kelas yang berbeza, iaitu, kepada InputStream. Secara lalai System.in, ini ialah urutan yang membaca data daripada peranti sistem—papan kekunci. Walau bagaimanapun, seperti dalam kes dengan System.out, kita boleh menggantikan sumber data, dan pembacaan tidak akan berlaku dari papan kekunci, tetapi dari tempat yang kita perlukan! Mari lihat 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 buat? Biasanya System.in"diikat" pada papan kekunci. Tetapi kami tidak mahu data dibaca dari papan kekunci: biarkan ia dibaca daripada baris teks biasa! Kami mencipta rentetan dan menerimanya sebagai tatasusunan bait. Mengapa kita memerlukan bait? Hakikatnya ialah ia InputStreamadalah kelas abstrak, dan kita tidak boleh mencipta contoh daripadanya. Anda perlu memilih beberapa kelas dari kalangan pewarisnya. Sebagai contoh, kita boleh mengambil ByteArrayInputStream. Ia mudah, dan hanya dengan namanya ia jelas cara ia berfungsi: sumber datanya ialah tatasusunan bait. Jadi kami mencipta tatasusunan bait yang sama ini dan menyerahkannya kepada pembina kami stream, yang akan membaca data. Malah, semuanya sudah sedia! Sekarang kita hanya perlu menggunakan kaedah System.setIn()untuk menetapkan nilai pembolehubah secara eksplisit in. Dalam kes out, seperti yang anda ingat, jelas mustahil untuk menetapkan nilai pembolehubah sama ada: anda perlu menggunakan kaedah khas setOut(). Selepas kami menetapkan InputStreampembolehubah yang kami buat System.in, kami perlu menyemak sama ada idea kami berjaya. Rakan lama akan membantu kita dengan ini - BufferedReader. Dalam situasi biasa, kod ini akan menyebabkan konsol dibuka dalam Intellij IDEa anda dan data yang anda masukkan daripada papan kekunci akan dibaca dari sana.
BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));

       String str;

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

           System.out.println(str);
       }
Tetapi apabila anda menjalankannya sekarang, anda akan melihat bahawa teks kami dari program hanya akan dikeluarkan ke konsol, tidak akan ada bacaan dari papan kekunci. Kami telah menukar sumber data, kini ia bukan papan kekunci, tetapi rentetan kami! Ia sangat mudah dan ringkas :) Dalam kuliah hari ini, kami berkenalan dengan kelas baharu dan melihat “hack” kecil baharu untuk bekerja dengan I/O. Masa untuk kembali ke kursus dan menyelesaikan beberapa masalah :) Jumpa anda di kuliah seterusnya!
Komen
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION