JavaRush /Курсы /All lectures for GE purposes /გამოტანის ნაკადები

გამოტანის ნაკადები

All lectures for GE purposes
1 уровень , 35 лекция
Открыта

1. კლასი OutputStream

შეყვანის ნაკადებზე უკვე ვისაუბრე. ახლა კი დროა გამოტანის ნაკადებზე ვისაუბროთ.

კლასი OutputStream არის მშობელი კლასი ყველა იმ კლასისთვის, რომელიც ბაიტზე გამოტანას ემსახურება. ეს არის აბსტრაქტული კლასი, რომელიც თვითონ არაფერს აკეთებს: იმისთვის აქვს შვილობილი კლასები, რომლებსაც სხვადასხვა სიტუაციებისთვის გამოიყენება.

რთულად ჟღერს. თუ მარტივად ვიტყვით, ეს კლასი ოპერირებს ბაიტებით და არა, მაგალითად, სიმბოლოებით ან სხვა მონაცემთა ტიპებით. ხოლო ის, რომ აბსტრაქტულია, ნიშნავს, რომ ჩვეულებრივ ვიყენებთ არა მას, არამედ მის შვილობილ რომელიმე კლასს. მაგალითად, FileOutputStream და მის მსგავსებს.

მაგრამ დავუბრუნდეთ კლასს OutputStream. ამ კლასს აქვს მეთოდები, რომლებიც ყველა მისი შვილობილი კლასი უნდა განახორციელოს. აი ძირითადი მათგანი:

მეთოდები აღწერა
void write(int b)
იწერს ერთ ბაიტს (არა int) ნაკადში.
void write(byte[] buffer)
იწერს ბაიტების მასივს ნაკადში
void write(byte[] buffer, off, len)
იწერს ბაიტების მასივის ნაწილს ნაკადში
void flush()
კრეფს ნაკადში ყველა მონაცემს, რომელიც ბუფერში ინახება
void close()
ხურავს ნაკადს

შვილობილი კლასის InputStream ობიექტის შექმნისას ჩვეულებრივ მითითებულია წყაროს ობიექტი, საიდანაც InputStream კითხულობს მონაცემებს. შვილობილი კლასის OutputStream ობიექტის შექმნისას ასევე ჩვეულებრივ მითითებულია სამიზნე ობიექტი ან სამიზნე ნაკადი, რომელშიც იქნება დაწერილი მონაცემები.

მოკლედ გავეცნოთ ყველა მეთოდს კლასის OutputStream:

მეთოდი write(int b)

ეს მეთოდი წერს გამოტანის ნაკადში ერთ ბაიტს (არა int). გადაცემული მნიშვნელობა გარდაიქმნება ბაიტ ტიპში, სამი პირველი ბაიტი იგნორირდება.

მეთოდი write(byte[] buffer)

წერს გამოტანის ნაკადში გადაცემულ ბაიტების მასივს. ყველაფერი.

მეთოდი write(byte[] buffer, int offset, int length)

წერს გამოტანის ნაკადში ბაიტების მასივის ნაწილს. ცვლადი offset მიუთითებს მასივის პირველი ელემენტის ნომერს, length — ჩაწერის ფრაგმენტის სიგრძეს.

მეთოდი flush()

მეთოდი flush() გამოიყენება იმისთვის, რომ მიაწვდინო დანიშნულების ნაკადს მონაცემები, რომლებიც შეიძლება ქეშირდება მიმდინარე ნაკადში. მნიშვნელოვანია ბუფერიზაციის და/ან რამდენიმე ნაკადის ობიექტების გამოყენების დროს, ერთმანეთთან დაკავშირებული.

მეთოდი close()

წერს დანიშნულების ობიექტში ყველა დაუწერელ მონაცემს. მეთოდი close() არ არის საჭირო, თუ იყენებთ try-with-resources.

მაგალითი — ფაილის კოპირება

კოდი მინიშნება
String src = "c:\\projects\\log.txt";
String dest = "c:\\projects\\copy.txt";

try(FileInputStream input = new FileInputStream(src);
FileOutputStream output = new FileOutputStream(dest))
{
   byte[] buffer = new byte[65536]; // 64Kb
   while (input.available() > 0)
   {
      int real = input.read(buffer);
      output.write(buffer, 0, real);
   }
}



InputStream ფაილის წაკითხვისთვის
OutputStream ფაილში ჩასაწერად

ბუფერი, რომელშიც წავიკითხავთ მონაცემებს
სანამ მონაცემები არის ნაკადში

წავიკითხოთ მონაცემები ბუფერში
ჩავწეროთ მონაცემები ბუფერიდან მეორე ნაკადში

2. კლასი Writer

კლასი Writer — ეს არის სრული ანალოგი კლასისა OutputStream, მხოლოდ ერთი სხვაობით: ის მუშაობს სიმბოლოებთან, char, ბაიტების ნაცვლად.

ეს არის აბსტრაქტული კლასი: კლასი Writer ობიექტს ვერ შექმნით. მისი მთავარი მიზანია იყოს საერთო მშობელი კლასი ასობით შვილობილი კლასისთვის და განუსაზღვროს მათ საერთო მოპყრობა სიმბოლური ნაკადებისათვის.

მეთოდები კლასის Writer (და ყველა მისი შვილობილი კლასი):

მეთოდები აღწერა
void write(int b)
იწერს ერთ სიმბოლოს (არა int) ნაკადში.
void write(char[] buffer)
იწერს სიმბოლოების მასივს ნაკადში
void write(char[] buffer, off, len)
იწერს სიმბოლოების მასივის ნაწილს ნაკადში
void write(String str)
იწერს სტრიქონს ნაკადში
void write(String str, off, len)
იწერს სტრიქონის ნაწილს ნაკადში
void flush()
კრეფს ნაკადში ყველა მონაცემს, რომელიც ბუფერში ინახება
void close()
ხურავს ნაკადს

მეთოდები ძალიან ჰგავს კლასის OutputStream მეთოდებს, მხოლოდ მუშაობს სიმბოლოებთან ბაიტების ნაცვლად.

მეთოდების მოკლე აღწერა:

მეთოდი write(int b)

ეს მეთოდი წერს გამოტანის ნაკადში ერთ სიმბოლოს char (არა int). გადაცემული მნიშვნელობა გარდაიქმნება char ტიპში, ორი პირველი ბაიტი იგნორირდება.

მეთოდი write(char[] buffer)

წერს გამოტანის ნაკადში გადაცემულ სიმბოლოების მასივს.

მეთოდი write(char[] buffer, int offset, int length)

წერს გამოტანის ნაკადში სიმბოლოების მასივის ნაწილს. ცვლადი offset მიუთითებს მასივის პირველი ელემენტის ნომერს, length — ჩაწერის ფრაგმენტის სიგრძეს.

მეთოდი write(String str)

წერს გამოტანის ნაკადში გადაცემულ სტრიქონს.

მეთოდი write(String str, int offset, int length)

წერს გამოტანის ნაკადში სტრიქონის ნაწილს: სტრიქონი გარდაიქმნება სიმბოლოების მასივად. ცვლადი offset მიუთითებს მასივის პირველი ელემენტის ნომერს, length — ჩაწერის ფრაგმენტის სიგრძეს.

მეთოდი flush()

მეთოდი flush() გამოიყენება იმისთვის, რომ მიაწვდინო დანიშნულების ნაკადს მონაცემები, რომლებიც შეიძლება ქეშირდება მიმდინარე ნაკადში. მნიშვნელოვანია ბუფერიზაციის და/ან რამდენიმე ნაკადის ობიექტების გამოყენების დროს, ერთმანეთთან დაკავშირებული.

მეთოდი close()

წერს დანიშნულების ობიექტში ყველა დაუწერელ მონაცემს. მეთოდი close() არ არის საჭირო, თუ იყენებთ try-with-resources.

პროგრამის მაგალითი, რომელიც კოპირებს ტექსტურ ფაილს:

კოდი მინიშნება
String src = "c:\\projects\\log.txt";
String dest = "c:\\projects\\copy.txt";

try(FileReader reader = new FileReader(src);
FileWriter writer = new FileWriter(dest))
{
   char[] buffer = new char[65536]; // 128Kb
   while (reader.ready())
   {
      int real = reader.read(buffer);
      writer.write(buffer, 0, real);
   }
}



Reader ფაილის წაკითხვისთვის
Writer ფაილში ჩასაწერად

ბუფერი, რომელშიც წავიკითხავთ მონაცემებს
სანამ მონაცემები არის ნაკადში

წავიკითხოთ მონაცემები ბუფერში
ჩავწეროთ მონაცემები ბუფერიდან მეორე ნაკადში

კლასი StringWriter

არის კიდევ ერთი საინტერესო კლასი — StringWriter, რომელიც მემკვიდრეა კლასის Writer. მას აქვს ცვლადი სტრიქონი — ობიექტი StringBuffer. და ყოველი ჩაწერისას რაღაც ობიექტში StringWriter, ტექსტი უბრალოდ ემატება შიდა ბუფერს.

მაგალითი:

კოდი მინიშნება
StringWriter writer = new StringWriter();
	writer.write("Hello");
	writer.write(String.valueOf(123));

	String result = writer.toString();
შექმნება მიზნის სიმბოლური ნაკადი StringWriter
სტრიქონი იწერება ბუფერში StringWriter
სტრიქონი იწერება ბუფერში StringWriter

შეიცვლება ობიექტის შიგთავსი სტრიქონად

ამ შემთხვევაში კლასი StringWriter — ფაქტობრივად, დამგობარია კლასის StringBuffer ზევით, მაგრამ კლას StringWriter — ნაკადის კლასის Writer მემკვიდრეა და შეიძლება გამოიყენება ობიექტთა ნაკადების ჯაჭვში. საკმაოდ სასარგებლო თვისება პრაქტიკაში.



Комментарии
ЧТОБЫ ПОСМОТРЕТЬ ВСЕ КОММЕНТАРИИ ИЛИ ОСТАВИТЬ КОММЕНТАРИЙ,
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ