Анализ Java.IO на основе шаблонов проектирования

Java задняя часть Шаблоны проектирования API

Если вы открыли 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Все классы под пакетом, но это может заставить нас больше не бояться и иметь общее представление о макросе, что нам удобно для проведения углубленного анализа конкретных объектов в соответствии с нашими потребностями.