This work is licensed with Creative Commons Attribution 3.0 Unported License. You are able: - to Share — to copy, distribute and transmit the work - to Remix — to adapt the work Автор: Leonid Krashenko e-mail: Leonid.Krashenko@gmail.com Перевод данного руководства - одна из тем атома Org1 (орг ван), см. http://trac.assembla.com/org1/wiki/WikiStart = Потоки и потоковые итераторы = == Потоки == === BufferedStream === Буферизует поток данных из восходящего входного потока (upstream input). Так, нисходящий поток (?) может обнаружить и использовать существующий буфер вместо того, чтобы создавать свой. (отметим, восходящий поток - который ближе к источнику, нисходящий - дальше от него) === DataFileStream === DataFileInput, DataFileOutput формируют файл с буфером (...). Поиск по такому файлу опустошает буфер (...). === DataStream === DataInput: облегчает считывание двоичных данных из произвольного InputStream, например: auto input = new DataInput (new FileInput("path")); auto x = input.readInt; auto y = input.readDouble; input.read (new char[10]); input.close; DataOutput: облегчает запись двоичных данных в произвольный OutputStream, например: auto output = new DataOutput (new FileOutput("path")); output.writeInt (1024); output.writeDouble (3.14159); output.write ("hello world"); output.flush.close; === DigestStream === DigestInput: позволяет вставить дайджест фильтр во входной поток, обновляет дайджест по мере поступления информации. DigestOutput: позволяет вставить дайджест фильтр в выходной поток, обновляет дайджест по мере протекания информации. В следующем примере показан процесс вычисления дайджеста MD5 как побочных эффект копирования файла: auto output = new DigestOutput(new FileOutput("output"), new Md5); output.copy (new FileInput("input")); Stdout.formatln ("hex digest: {}", output.digest.hexDigest); === EndianessStream === (...) EndianInput и EndianOutput === FileStream === Простая обертка вокруг FileConduit FileInput и FileOutput === FormatStream === Позволяет связать форматёр utf8 с произвольным OutputStream. Например: auto output = new FormatOutput (new FileOutput("path")); output.formatln ("{} green bottles", 10); output.close; Это простая обертка над классом Print, и она ограничена формированием utf8-выхода. Используйте класс Print напрямую, если надо сгенерировать utf16/32 выход. === GreedyStream === GreedyOutput: фильтр канала, подтверждающий целостность записи; GreedyInput: фильтр канала, подтверждающий целостность чтения; === Line Stream === LineInput: позволяет привязать строковый токенайзер к произвольному InputStream, например: auto input = new LineInput (new FileInput("path")); foreach (line; input) ... input.close; Отметим, что это простая обертка над LineIterator, и поддерживает только строки utf8. Используйте LineIterator напрямую, если вам нужны utf16/32, или другие классы модуля tango.text.stream для других операций с токенами. (...) === MapStream === MapInput!(T) предоставляет механизмы загрузки потока параметров (properties) из, например, файла или другого источника, содержащего строки текста с синтаксисом имя=значение. MapOutput!(T) предоставляет механизмы записи потока параметров (properties). === SnoopStream === SnoopInput, SnoopOutput - потоки, отражающие последовательность вызовов. По умолчанию лог активности отправляется в Cerr. Данные потоки полезны при отладке вызовов в потоках. === TextFileStream === TextFileInput и TextFileOutput: работают с файлами построчно. === TypesStream === TypedInput!(T) и TypesOutput!(T): для представления встроенных типов в качестве дискретных элементов. Ввод-вывод буферизован и должен давать прирост производительности. === UtfStream === UtfInput!(T,S) и UtfOutput!(S,T): потоки конвертации в/из UTF, поддерживающие (?) кросс-трансляцию char, wchar и dchar вариантов. Для поддержки endian-вариантов вы можете использовать восходящий поток (?) EndianStream (...). == Потоковые итераторы == В Танго имеется множество классов для склеивания теста в блоки по определенным паттернам. Эти классы используют InputStream, имеют шаблоны для char, wchar и dchar типов. Например, существует итератор для генерации строк текста, основанный на поиске символов конца строки. Классы итераторов являются клиентами Buffer и могут быть совместно использованы с клиентами чтения и записи. Результаты работы итераторов обычно отображаются прямо из буфера, минуя работу в куче (heap) там, где приложению этого не требуется. Если приложению требуется сохранить какой-либо блок, он должен быть предварительно сопирован из буфера. === Исключения итераторов === Исключение переполнения выбрасывается, если размер одного элемента больше, чем размер всего буфера. Либо буфер слишком мал, либо элемент слишком велик (обычно размер буфера ввода-вывода - 16 Кб). Эту проблему можно решить, повысив размер буфера.