JavaRush /Java Blogu /Random-AZ /PrintStream sinfi nə üçündür?

PrintStream sinfi nə üçündür?

Qrupda dərc edilmişdir
Salam! PrintStreamBu gün biz sinif və onun edə biləcəyi hər şey haqqında danışacağıq . PrintStream sinfi nə üçündür - 1Əslində, siz artıq sinfin iki metodu ilə tanışsınız PrintStream. Bunlar yəqin ki, hər gün istifadə etdiyiniz print()və metodlardır :) Dəyişən obyekt olduğu üçün metodu çağırdığınız zaman bu xüsusi sinfin metodunu çağırırsınız. Sinfin ümumi məqsədi məlumatı hansısa axına çıxarmaqdır. Bu sinifdə bir neçə konstruktor var. Ən çox yayılmışlardan bir neçəsi bunlardır: println()System.outPrintStreamSystem.out.println()PrintStream
  • PrintStream(OutputStream outputStream)
  • PrintStream(File outputFile) throws FileNotFoundException
  • PrintStream(String outputFileName) throws FileNotFoundException
Gördüyünüz kimi, biz obyektin konstruktoruna keçə bilərik PrintStream, məsələn, məlumatları çıxarmaq istədiyimiz faylın adını. Və ya alternativ olaraq, obyektin özü File. Bunun necə işlədiyinə nümunələrlə baxaq:
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);
   }
}
Bu kod iş masasında fayl yaradacaq test.txt(əgər o artıq mövcud deyilsə) və oraya ardıcıl olaraq nömrəmizi, sətirimizi və boolean-dəyişənimizi yazacaq. Proqram işlədikdən sonra faylımızın məzmunu bunlardır:

222
Hello world!
false
Yuxarıda dediyimiz kimi, fayl obyektinin özünü ötürmək lazım deyil File. Sadəcə konstruktorda ona gedən yolu göstərməlisiniz:
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);
   }
}
Bu kod əvvəlki ilə eyni olacaq. Baxmaq üçün başqa bir maraqlı üsul , printf()və ya formatlanmış sətir çıxışıdır. "Formatlanmış sətir" nə deməkdir? İzah etmək üçün bir misal verəcəm:
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();

   }
}
%sBurada, robotumuzun adını və yaşını sətirdə açıq şəkildə yazmaq əvəzinə, göstəricilərdən istifadə edərək bu məlumat üçün “boş yer” buraxırıq %d. Biz isə bu yerlərdə olması lazım olan məlumatları parametr kimi ötürürük. Bizim vəziyyətimizdə bu, " Amigo " sətri və 18 rəqəmidir. Məsələn, başqa bir boşluq yarada bilərik: deyək, %b, və başqa bir parametr ötürə bilərik. Bu nə üçündür? İlk növbədə, elastikliyi artırmaq. Proqramınızın tez-tez salamlama mesajı göstərməsi lazımdırsa, hər yeni robot üçün tələb olunan mətni əl ilə daxil etməli olacaqsınız. Siz hətta bu mətni sabit hala gətirə bilməyəcəksiniz: hər kəsin adları və yaşları fərqlidir! Ancaq yeni metoddan istifadə edərək, salamlama ilə bir sətir sabitə çıxara bilərsiniz və lazım olduqda, sadəcə olaraq metoddakı parametrləri dəyişdirin 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();
   }
}

System.spoofing

Bu mühazirədə biz “sistemlə mübarizə aparacağıq” və dəyişəni necə əvəz edəcəyimizi System.invə sistemin çıxışını ehtiyac duyduğumuz yerə yönləndirməyi öyrənəcəyik. PrintStream sinfi nə üçündür? - 2Siz bunun nə olduğunu unutmusunuz System.in, lakin heç bir JavaRush tələbəsi bu quruluşu heç vaxt unutmayacaq:
BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
System.in(kimi System.out) statik sinif dəyişənidir System. Lakin, fərqli olaraq System.out, o, başqa bir sinfə aiddir, yəni InputStream. Varsayılan olaraq System.in, bu, sistem cihazından - klaviaturadan məlumatları oxuyan bir ipdir. Bununla belə, ilə olduğu kimi System.out, biz məlumat mənbəyini əvəz edə bilərik və oxuma klaviaturadan deyil, bizə lazım olan yerdən baş verəcəkdir! Bir misala baxaq:
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);
       }

   }
}
Bəs biz nə etdik? Adətən System.inklaviaturaya "bağlanır". Lakin biz məlumatların klaviaturadan oxunmasını istəmirik: adi mətn sətirindən oxunsun! Biz sətir yaratdıq və onu bayt massivi kimi qəbul etdik. Niyə baytlara ehtiyacımız var? Fakt budur ki, o, InputStreammücərrəd bir sinifdir və biz onun nümunəsini yarada bilmərik. Siz onun varisləri arasından bir sinif seçməli olacaqsınız. Məsələn, götürə bilərik ByteArrayInputStream. Bu sadədir və sadəcə adından onun necə işlədiyi aydındır: onun məlumat mənbəyi bayt massividir. streamBeləliklə, biz eyni bayt massivi yaradırıq və onu məlumatları oxuyacaq konstruktorumuza ötürürük . Əslində, hər şey artıq hazırdır! System.setIn()İndi sadəcə olaraq dəyişənin dəyərini təyin etmək üçün metoddan istifadə etməliyik in. Yadınızdadırsa out, dəyişənin dəyərini təyin etmək də mümkün deyildi: xüsusi bir metoddan istifadə etməli idiniz setOut(). InputStreamYaratdığımız dəyişəni təyin etdikdən sonra System.infikrimizin işlədiyini yoxlamaq lazımdır. Köhnə bir dost bu işdə bizə kömək edəcək - BufferedReader. Normal vəziyyətdə, bu kod Intellij IDEa-da konsolun açılmasına səbəb olacaq və klaviaturadan daxil etdiyiniz məlumatlar oradan oxunacaq.
BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));

       String str;

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

           System.out.println(str);
       }
Amma indi onu işə saldıqda görəcəksiniz ki, proqramdakı mətnimiz sadəcə konsola çıxarılacaq, klaviaturadan oxunmayacaq. Məlumat mənbəyini dəyişdik, indi klaviatura deyil, bizim simimizdir! Çox asan və sadədir :) Bugünkü mühazirəmizdə biz yeni siniflə tanış olduq və I/O ilə işləmək üçün yeni kiçik “hack”ə baxdıq. Kursa qayıtmaq və bəzi problemləri həll etmək vaxtıdır :) Növbəti mühazirədə görüşənədək!
Şərhlər
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION