„Здравей, Амиго! Днес Ели ти каза за модела на адаптера.“
Повечето класове, свързани с I/O потоци, са реализирани като адаптери. Те or преобразуват еквивалентни интерфейси, or ги свързват, започвайки от простите и преминавайки към сложните.
" InputStreamReader и BufferedReader също ли са адаптери? Най-малкото те са много подобни на адаптерите по начина, по който се използват: след като обектът е създаден, той се предава на конструктора на друг клас."
„Да, InputStreamReader преобразува интерфейса InputStream в интерфейса Reader . BufferedReader не е адаптер в най-чистата му форма, защото създателите на Java са решor да не дават на методите му собствен отделен интерфейс. Но това е сродна душа.“
Вместо да напишат базorон различни класове, създателите на Java написаха две дузини адаптери и им позволиха да се свързват помежду си, Howто програмист може да поиска.
Този подход е много удобен. Програмистът винаги може да напише своя клас и/or адаптер, да го накара да имплементира standardн интерфейс и да го включи във веригата от адаптерни обекти, които изгражда.
„Така че така работи всичко. Вместо големи сложни класове, ние правим вериги от прости обекти и адаптери. И след това вие просто ги създавате и ги комбинирате в правилния ред!“
„И прилагате всичко, което липсва.“
— Да, разбрах.
"Но всъщност исках да ви разкажа за Reader и Writer днес. Това са два абстрактни класа, които са много подобни на класовете InputStream и OutputStream. Но за разлика от тези класове, тези два класа работят със знаци. Те четат и пишат знаци. Те са много удобно при работа с текстова информация. Нека да разгледаме методите, които имат:"
Читателски методи | Какво прави методът |
---|---|
|
„Този метод незабавно чете няколко знака в буфера ( char array ), докато буферът се запълни or докато източникът няма повече знаци за четене.“ Методът връща броя на действително прочетените знаци (който може да бъде по-малък от дължината на масива) |
|
"Този метод чете един знак и го връща. Резултатът се разширява до int за изглежда. Ако няма налични знаци, тогава методът връща -1." |
|
Този метод връща true, ако има непрочетени знаци за методите за четене |
|
Този метод "затваря" потока. Извиквате това, когато приключите с работата с потока. След това обектът извършва операциите по поддържане, необходими за затваряне на file и т.н. В този момент не можете да четете повече данни от потока. |
„Оказва се, че методът read(char [] cbuf) на Reader ни позволява да четем цели блокове от знаци, instead of по един знак наведнъж. Така че е по-бързо и по-удобно.“
„Точно така. А сега да видим Howви методи има Writer:“
Метод | Какво прави методът |
---|---|
|
Този метод записва един знак. Типът int е стеснен до char. Допълнителната част просто се изхвърля. |
|
Този метод записва масив от знаци. |
|
Този метод записва низ. Той просто се преобразува в масив от знаци и след това се извиква вторият метод. |
|
Ако потокът съхранява вътрешно няHowви данни, които все още не са записани, този метод принуждава записването им. |
|
Този метод "затваря" потока. Извиквате това, когато приключите с работата с потока. След това обектът изпълнява операциите по поддържане, необходими за затваряне на file и т.н. Вече не можете да записвате данни в потока и flush се извиква автоматично. |
Важно е да разберете, че Reader и Writer са абстрактни класове. Те не правят нищо и практически не съдържат code. Всички техни методи ще трябва да бъдат имплементирани в класовете, които ги наследяват. Тяхната работа е да стандартизират How си взаимодействат класовете . Разработчиците не трябва да измислят свои собствени стандарти, за да си взаимодействат помежду си. Много по-удобно е за всеки да поддържа няколко основни стандарта. Това позволява на класове, написани от различни програмисти, лесно да взаимодействат не само с класове, написани от създателите на Java, но и с класове, написани от други програмисти.
Стандартите са мощни.
„Съгласен съм. Поддържането на общи стандарти е от полза за всички.“
GO TO FULL VERSION