Если вы открыли java.io, я думаю, вы, должно быть, испугались.Существует так много API для ввода-вывода, но, пожалуйста, не бойтесь.Сегодня я возьму вас на анализ ввода-вывода java с точки зрения дизайна узоры. .
Что такое ввод-вывод
ввод/вывод, обычно относится к вводу и выводу данных между внутренней памятью и внешней памятью или другими периферийными устройствами.
Сегодня проблема ввода-вывода является основной проблемой всего взаимодействия человека с компьютером, потому что ввод-вывод является основным каналом для получения и обмена информацией машинами.
Однако ввод-вывод можно разделить наФормат данных и способ передачи, и эти две категории являются ключевыми факторами, влияющими на эффективность. :груша:
Формат данных делится на:
- Байты: InputStream и OutputStream
- Персонажи: Писатель и Читатель
Способы передачи делятся на:
- Дисковые операции: Файл
- Работа в сети: сокет
Преобразование между байтами и символами
Все операции ввода-вывода компьютера основаны на байтах, но почему существуют символьные операции?Это потому, что данные, с которыми мы работаем в программе, обычно имеют форму символов, поэтому для удобства работы она обеспечивает прямое чтение и писать символы Писатель и Читатель.
Ниже я будурежим адаптерас точки зрения анализа байтов и персонажей. :леденец:
С точки зрения источника
//继承Reader,实现Reader的接口
public class InputStreamReader extends Reader {
//用于编解码的对象
private final StreamDecoder sd;
public InputStreamReader(InputStream in) {
super(in);
try {
sd = StreamDecoder.forInputStreamReader(in, this, (String)null); // ## check lock object
} catch (UnsupportedEncodingException e) {
// The default encoding should always be available
throw new Error(e);
}
}
public int read() throws IOException {
return sd.read();
}
}
Каждый объект InputStreamReader наследует Reader, а затем косвенно владеет экземпляром InputStream через StreamDecoder, поскольку необходимо кодировать и декодировать преобразование byte в char.
Итак, InputStreamReader — это адаптер между байтами и символами, а OutputStreamReader — аналогичная реализация.
FilterInputStream
Далее я начну с роли FilterInputStream, чтобы проанализировать архитектуру всего пакета java.io.
Из вышеприведенного анализа вшаблон декоратора中,InputStream就是需要被装饰的基类,FilterInputStream就是所有装饰者的基类。 :кекс:
java.io
Теперь мы можем примерно бытьjava.io
Пакет разделен на следующие случаи. :арбуз:
-
Некоторые базовые интерфейсы.
Например: Closeable, Readable, DataInput.
-
Все подклассы Reader/Writer, это адаптеры для чтения и записи символов и расширения к адаптерам.
Например: InputStreamReader, FileReader, BufferedReader, CharArrayReader.
-
Все подклассы InputStream/OutputStream, которые являются различными экземплярами чтения и записи байтов, являются декорированными объектами.
Например: FileInputStream, SocketInputStream, StringBufferInputStream, ByteArrayInputStream.
-
Все подклассы FilterInputStream/FilterOutputStream являются декораторами и могут многократно оборачиваться.
Например: PushbackInputStream, BufferedInputStream, DataInputStream, LineNumberInputStream.
Конечно, приведенные выше ситуации не полностью описываютjava.io
Все классы под пакетом, но это может заставить нас больше не бояться и иметь общее представление о макросе, что нам удобно для проведения углубленного анализа конкретных объектов в соответствии с нашими потребностями.