JavaRush /Java blogi /Random-UZ /PrintStream klassi nima uchun?

PrintStream klassi nima uchun?

Guruhda nashr etilgan
Salom! Bugun biz sinf PrintStreamva u qila oladigan barcha narsalar haqida gaplashamiz. PrintStream klassi nima uchun - 1Aslida, siz allaqachon sinfning ikkita usuli bilan tanishsiz PrintStream. Bu siz har kuni ishlatadigan usullar print()va usullardir :) O'zgaruvchi ob'ekt bo'lgani uchun metodni chaqirganingizda , siz ushbu sinfning usulini chaqirasiz. Sinfning umumiy maqsadi ma'lumotni qandaydir oqimga chiqarishdir. Bu sinfda bir nechta konstruktorlar mavjud. Bu erda eng keng tarqalgan bir nechtasi: println()System.outPrintStreamSystem.out.println()PrintStream
  • PrintStream(OutputStream outputStream)
  • PrintStream(File outputFile) throws FileNotFoundException
  • PrintStream(String outputFileName) throws FileNotFoundException
Ko'rib turganingizdek, biz ob'ektning konstruktoriga o'tishimiz mumkin PrintStream, masalan, biz ma'lumotlarni chiqarmoqchi bo'lgan fayl nomi. Yoki, muqobil ravishda, ob'ektning o'zi File. Keling, bu qanday ishlashini misollar bilan ko'rib chiqaylik:
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);
   }
}
Ushbu kod ish stolida fayl yaratadi test.txt(agar u allaqachon mavjud bo'lmasa) va booleanu erga ketma-ket raqamimizni, qatorni va -variableni yozadi. Dastur ishga tushirilgandan so'ng faylimizning mazmuni:

222
Hello world!
false
Yuqorida aytib o'tganimizdek, fayl ob'ektini o'zi o'tkazish shart emas File. Konstruktorda unga yo'lni ko'rsatish kifoya:
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);
   }
}
Ushbu kod avvalgisi bilan bir xil ishlaydi. Ko'rib chiqishning yana bir qiziqarli usuli , printf()yoki formatlangan satr chiqishi. "Formatlangan satr" nimani anglatadi? Tushuntirish uchun men misol keltiraman:
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();

   }
}
Bu yerda, robotimizning nomi va yoshini bir qatorga aniq yozish o'rniga, biz ko'rsatgichlardan foydalanib, ushbu ma'lumot uchun "bo'sh joy" qoldirganga %so'xshaymiz %d. Va biz bu joylarda bo'lishi kerak bo'lgan ma'lumotlarni parametr sifatida o'tkazamiz. Bizning holatda, bu " Amigo " qatori va 18 raqami. Biz, masalan, boshqa bo'shliqni yaratishimiz mumkin: aytaylik, %b, va boshqa parametrni o'tkazamiz. Bu nima uchun? Avvalo, moslashuvchanlikni oshirish. Agar dasturingiz tez-tez salomlash xabarini ko'rsatishi kerak bo'lsa, har bir yangi robot uchun kerakli matnni qo'lda kiritishingiz kerak bo'ladi. Siz hatto bu matnni doimiy holatga keltira olmaysiz: har kimning ismlari va yoshi har xil! Ammo yangi usuldan foydalanib, siz salom bilan satrni doimiyga chiqarishingiz mumkin va agar kerak bo'lsa, usuldagi parametrlarni o'zgartirishingiz mumkin 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

Ushbu ma'ruzada biz "tizimga qarshi kurashamiz" va o'zgaruvchini qanday almashtirishni System.inva tizim chiqishini kerakli joyga yo'naltirishni o'rganamiz. PrintStream klassi nima uchun - 2Siz bu nima ekanligini unutgan bo'lishingiz mumkin System.in, ammo JavaRush dasturining hech bir talabasi bu qurilishni hech qachon unutmaydi:
BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
System.in(kabi System.out) statik sinf o'zgaruvchisidir System. Ammo, dan farqli o'laroq System.out, u boshqa sinfga, ya'ni ga tegishli InputStream. Odatiy bo'lib System.in, bu tizim qurilmasi - klaviaturadan ma'lumotlarni o'qiydi. Biroq, misolida bo'lgani kabi System.out, biz ma'lumotlar manbasini almashtirishimiz mumkin va o'qish klaviaturadan emas, balki kerakli joydan amalga oshiriladi! Keling, bir misolni ko'rib chiqaylik:
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);
       }

   }
}
Xo'sh, biz nima qildik? Odatda System.inklaviaturaga "bog'langan". Lekin biz ma'lumotlar klaviaturadan o'qilishini xohlamaymiz: uni oddiy matn qatoridan o'qishga ruxsat bering! Biz satr yaratdik va uni bayt massivi sifatida oldik. Nima uchun bizga baytlar kerak? Gap shundaki InputStream, bu mavhum sinf va biz uning namunasini yarata olmaymiz. Siz uning merosxo'rlari orasidan biron bir sinfni tanlashingiz kerak bo'ladi. Misol uchun, biz olishimiz mumkin ByteArrayInputStream. Bu oddiy va faqat nomi bilan uning qanday ishlashi aniq: uning ma'lumotlar manbai bayt massividir. Shunday qilib, biz xuddi shu bayt massivini yaratamiz va uni konstruktorimizga o'tkazamiz stream, u ma'lumotlarni o'qiydi. Aslida, hamma narsa allaqachon tayyor! System.setIn()Endi biz faqat o'zgaruvchining qiymatini aniq belgilash uchun usuldan foydalanishimiz kerak in. Esingizda bo'lsa out, o'zgaruvchining qiymatini belgilash ham mumkin emas edi: siz maxsus usuldan foydalanishingiz kerak edi setOut(). InputStreamBiz yaratgan o'zgaruvchini tayinlaganimizdan so'ng System.in, bizning fikrimiz ishlaganligini tekshirishimiz kerak. Bunda bizga eski do'st yordam beradi - BufferedReader. Oddiy holatda, bu kod sizning Intellij IDEa-da konsolning ochilishiga olib keladi va siz klaviaturadan kiritgan ma'lumotlar u erdan o'qiladi.
BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));

       String str;

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

           System.out.println(str);
       }
Ammo hozir uni ishga tushirganingizda, dasturdagi matnimiz shunchaki konsolga chiqishini, klaviaturadan o'qish bo'lmasligini ko'rasiz. Biz ma'lumotlar manbasini o'zgartirdik, endi bu klaviatura emas, balki bizning satrimiz! Bu juda oson va sodda :) Bugungi ma'ruzada biz yangi sinf bilan tanishdik va I/U bilan ishlash uchun yangi kichik "hack" ni ko'rib chiqdik. Kursga qaytish va ba'zi muammolarni hal qilish vaqti keldi :) Keyingi ma'ruzada ko'rishguncha!
Izohlar
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION