„Здравей, Амиго! Днес Ели ти каза за модела на адаптера.“

Повечето класове, свързани с I/O потоци, са реализирани като адаптери. Те or преобразуват еквивалентни интерфейси, or ги свързват, започвайки от простите и преминавайки към сложните.

" InputStreamReader и BufferedReader също ли са адаптери? Най-малкото те са много подобни на адаптерите по начина, по който се използват: след като обектът е създаден, той се предава на конструктора на друг клас."

„Да, InputStreamReader преобразува интерфейса InputStream в интерфейса Reader . BufferedReader не е адаптер в най-чистата му форма, защото създателите на Java са решor да не дават на методите му собствен отделен интерфейс. Но това е сродна душа.“

Вместо да напишат базorон различни класове, създателите на Java написаха две дузини адаптери и им позволиха да се свързват помежду си, Howто програмист може да поиска.

Този подход е много удобен. Програмистът винаги може да напише своя клас и/or адаптер, да го накара да имплементира standardн интерфейс и да го включи във веригата от адаптерни обекти, които изгражда.

„Така че така работи всичко. Вместо големи сложни класове, ние правим вериги от прости обекти и адаптери. И след това вие просто ги създавате и ги комбинирате в правилния ред!“

„И прилагате всичко, което липсва.“

— Да, разбрах.

"Но всъщност исках да ви разкажа за Reader и Writer днес. Това са два абстрактни класа, които са много подобни на класовете InputStream и OutputStream. Но за разлика от тези класове, тези два класа работят със знаци. Те четат и пишат знаци. Те са много удобно при работа с текстова информация. Нека да разгледаме методите, които имат:"

Читателски методи Какво прави методът
int read(char[] cbuf);
„Този ​​метод незабавно чете няколко знака в буфера ( char array ), докато буферът се запълни or докато източникът няма повече знаци за четене.“
Методът връща броя на действително прочетените знаци (който може да бъде по-малък от дължината на масива)
int read();
"Този метод чете един знак и го връща. Резултатът се разширява до int за изглежда. Ако няма налични знаци, тогава методът връща -1."
boolean ready();
Този метод връща true, ако има непрочетени знаци за методите за четене
void close();
Този метод "затваря" потока. Извиквате това, когато приключите с работата с потока.
След това обектът извършва операциите по поддържане, необходими за затваряне на file и т.н.
В този момент не можете да четете повече данни от потока.

„Оказва се, че методът read(char [] cbuf) на Reader ни позволява да четем цели блокове от знаци, instead of по един знак наведнъж. Така че е по-бързо и по-удобно.“

„Точно така. А сега да видим Howви методи има Writer:“

Метод Какво прави методът
void write(int c);
Този метод записва един знак. Типът int е стеснен до char. Допълнителната част просто се изхвърля.
void write(char[] cbuff);
Този метод записва масив от знаци.
void write(String s);
Този метод записва низ. Той просто се преобразува в масив от знаци и след това се извиква вторият метод.
void flush();
Ако потокът съхранява вътрешно няHowви данни, които все още не са записани, този метод принуждава записването им.
void close();
Този метод "затваря" потока. Извиквате това, когато приключите с работата с потока.
След това обектът изпълнява операциите по поддържане, необходими за затваряне на file и т.н. Вече не можете да записвате данни в потока и flush се извиква автоматично.

Важно е да разберете, че Reader и Writer са абстрактни класове. Те не правят нищо и практически не съдържат code. Всички техни методи ще трябва да бъдат имплементирани в класовете, които ги наследяват. Тяхната работа е да стандартизират How си взаимодействат класовете . Разработчиците не трябва да измислят свои собствени стандарти, за да си взаимодействат помежду си. Много по-удобно е за всеки да поддържа няколко основни стандарта. Това позволява на класове, написани от различни програмисти, лесно да взаимодействат не само с класове, написани от създателите на Java, но и с класове, написани от други програмисти.

Стандартите са мощни.

„Съгласен съм. Поддържането на общи стандарти е от полза за всички.“