1. OutputStream
клас
Наскоро проучихме входните потоци. Време е да поговорим за изходните потоци.
Класът OutputStream
е родителският клас за всички класове, които поддържат byteов изход. Това е абстрактен клас, който не прави нищо сам, но има класове наследници за всеки случай.
Звучи изключително сложно. Казано по-просто, този клас оперира с byteове, а не, например, със знаци or други типове данни. А фактът, че е абстрактен, означава, че обикновено не го използваме, а по-скоро един от неговите потомствени класове. Например FileOutputStream
и други подобни.
Но обратно към OutputStream
класа. Този клас има методи, които всички негови класове-потомци трябва да изпълняват. Ето основните от тях:
Методи | Описание |
---|---|
|
Записва един byte (не int ) в потока. |
|
Записва масив от byteове в потока |
|
Записва част от масив от byteове в потока |
|
Записва всички данни, съхранени в буфера, в потока |
|
Затваря потока |
Когато създавате обект от клас, който наследява InputStream
, обикновено посочвате обект източник, InputStream
от който чете данни. Когато създавате обект от клас, който наследява OutputStream
, обикновено посочвате и целевия обект or поток, в който ще се записват данни.
Нека прегледаме накратко всички методи на OutputStream
класа:
write(int b)
метод
Този метод записва един byte (не int
) в изходния поток. Предадената стойност се преобразува в byte и първите три byteа на int се отхвърлят.
write(byte[] buffer)
метод
Записва дадения масив от byteове в изходния поток. Това е.
write(byte[] buffer, int offset, int length)
метод
Записва част от предадения масив от byteове в изходния поток. Променливата offset показва индекса на първия елемент от масива и length
е дължината на подмножеството, което трябва да се запише.
flush()
метод
Методът flush()
се използва, за да принуди всички данни, потенциално буферирани в текущия поток, да бъдат записани в целевия поток. Това е уместно при използване на буфериране и/or множество обекти на поток, подредени във верига.
close()
метод
Записва всички незаписани данни в целевия обект. Методът close()
не трябва да се извиква, ако използвате try-with-resources
блок.
Пример за копиране на файл
Код | Забележка |
---|---|
|
InputStream за четене от файл OutputStream за запис във файл Буфер, в който ще четем данните Докато има данни в потока Четене на данни в буфера Записване на данните от буфера във втория поток |
2. Writer
клас
Класът Writer
е абсолютно същият като OutputStream
класа, но само с една разлика още веднъж: работи със знаци ( char
) instead of с byteове.
Това е абстрактен клас: не можете да създавате обекти от Writer
класа. Основната му цел е да бъде общ родителски клас за стотици наследствени класове и да им даде общи методи за работа с потоци от символи.
Методи на Writer
класа (и всички негови потомствени класове):
Методи | Описание |
---|---|
|
Записва един символ (не int ) в потока. |
|
Записва масив от знаци в потока |
|
Записва част от масив от знаци в потока |
|
Записва низ в потока |
|
Записва част от низ в потока |
|
Записва всички данни, съхранени в буфера, в потока |
|
Затваря потока |
Методите са много подобни на методите на OutputStream
класа, но работят със символи instead of с byteове.
Описание на методите:
write(int b)
метод
Този метод записва един знак ( char
— не int
) в изходния поток. Предадената стойност се преобразува в a char
и първите два byteа се отхвърлят.
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()
се използва, за да принуди всички данни, потенциално буферирани в текущия поток, да бъдат записани в целевия поток. Това е уместно при използване на буфериране и/or множество обекти на поток, подредени във верига.
close()
метод
Записва всички незаписани данни в целевия обект. Методът close()
не трябва да се извиква, ако използвате try-with-resources
блок.
Пример за програма, която копира текстов файл:
Код | Забележка |
---|---|
|
Reader за четене от файл Writer за запис във файл Буфер, в който ще четем данните Докато има данни в потока Четене на данни в буфер Записване на данните от буфера във втория поток |
StringWriter
клас
Има още един интересен клас, който наследява Writer
класа: той се нарича StringWriter
. Той съдържа променлив низ — StringBuffer
обект. И всеки път, когато "пишете" нещо на StringWriter
обекта, текстът просто се добавя към неговия вътрешен буфер.
Пример:
Код | Забележка |
---|---|
|
StringWriter Създава се целеви символен поток ( ) Низ се записва в буфера вътре StringWriter Низ се записва в буфера вътре StringWriter Преобразуване на съдържанието на обект в низ |
В този случай StringWriter
класът е по същество обвивка над StringBuffer
класа, но StringWriter
класът е потомък на Writer
класа поток и може да се използва във вериги от обекти на поток. Това е доста полезно свойство на практика.
3. PrintStream
клас
Класовете на изходния поток могат също да бъдат поставени във верига с междинни потоци, които записват данни в целевия поток, който им се предава. Общият изглед на взаимодействието на тези потоци изглежда така:
Най-интересният и многофункционален от всички междинни изходни потоци е PrintStream
. Има десетки методи и цели 12 конструктора.
Класът PrintStream
наследява FilterOutputStream
класа, който наследява OutputStream
. Това означава, че PrintStream
класът има всички методи на родителските класове в допълнение към своите собствени методи . Ето най-интересните от тях:
Методи | Описание |
---|---|
|
Преобразува подавания обект в низ и го извежда към целевия поток. |
|
Преобразува подавания обект в низ и го извежда към целевия поток. Добавя нов ред в края |
|
Извежда знак за нов ред към целевия поток |
|
Конструира и извежда низ въз основа на форматиращия низ и предадените аргументи; подобно на String.format() метода |
И къде са тези десетки методи, ще попитате?
Е, има много варианти на print()
и println()
методи с различни параметри. Те могат да бъдат обобщени в тази table.
Няма да се потапяме в тези методи, защото вече ги познавате добре. Можете ли да познаете Howво имам предвид?
помниш System.out.println()
ли Но може да се напише в два реда:
Код | Конзолен изход |
---|---|
|
|
Нашата любима команда е извикване на метода на статичната променлива на класа. И типът на тази променлива е .System.out.println()
println()
out
System
PrintStream
В много нива на CodeGym и в почти всяка задача вие сте извиквали методи на PrintStream
класа, без дори да го знаете!
Практическа употреба
Java има този интересен клас, наречен ByteArrayOutputStream
, който е динамично нарастващ byteов масив, който наследява OutputStream
.
Обект ByteArrayOutputStream
и PrintStream
обект могат да бъдат свързани по следния начин:
Код | Описание |
---|---|
|
Създайте буфер за запис в паметта Увийте буфера в PrintStream обект Запишете данни в конзолата Преобразувайте масива в низ! Конзолен изход:
|
GO TO FULL VERSION