С# с использованием потоков
Потоки для меня таинственны. Я не знаю, когда использовать этот поток и как его использовать. Может кто-нибудь объяснить мне, как используются потоки?
Если я правильно понимаю, есть три типа потоков:
-
stream
-
read stream
-
write stream
Это правильно? И, например, в чем разница между Memorystream
и a FileStream
?
Ответы
Ответ 1
A поток - это объект, используемый для передачи данных. Существует общий класс потоков System.IO.Stream
, из которого выводятся все другие классы потоков в .NET. Класс Stream
имеет дело с байтами.
Конкретные потоковые классы используются для обработки других типов данных, кроме байтов. Например:
- Класс
FileStream
используется, когда внешним источником является файл
-
MemoryStream
используется для хранения данных в памяти
-
System.Net.Sockets.NetworkStream
обрабатывает сетевые данные
Потоки чтения/записи, такие как StreamReader
и StreamWriter
, не являются потоками - они не являются производными от System.IO.Stream
, они предназначены для записи и чтения данных из и в поток!
Ответ 2
Чтобы немного рассказать о других ответах здесь, и помогите объяснить много кода примера, который вы увидите пунктиром, большую часть времени вы не читаете и не пишете в поток напрямую. Потоки - это низкоуровневые средства для передачи данных.
Вы заметите, что функции для чтения и записи все ориентированы по байтам, например. WriteByte(). Нет функций для работы с целыми числами, строками и т.д. Это делает поток очень универсальным, но менее простым в работе, если, скажем, вы просто хотите передать текст.
Однако .NET предоставляет классы, которые преобразуют между родными типами и интерфейсом потока низкого уровня, и передает данные в или из потока для вас. Некоторые известные классы:
StreamWriter // Badly named. Should be TextWriter.
StreamReader // Badly named. Should be TextReader.
BinaryWriter
BinaryReader
Чтобы использовать их, сначала вы приобретаете свой поток, затем создаете один из вышеуказанных классов и связываете его с потоком. Например.
MemoryStream memoryStream = new MemoryStream();
StreamWriter myStreamWriter = new StreamWriter(memoryStream);
StreamReader и StreamWriter конвертируют между нативными типами и их строковыми представлениями, а затем передают строки в поток и из потока в виде байтов. Так
myStreamWriter.Write(123);
будет писать "123" (три символа "1", "2", затем "3" ) в поток. Если вы имеете дело с текстовыми файлами (например, html), StreamReader и StreamWriter - это классы, которые вы будете использовать.
В то время как
myBinaryWriter.Write(123);
будет записывать четыре байта, представляющих 32-разрядное целочисленное значение 123 (0x7B, 0x00, 0x00, 0x00). Если вы имеете дело с бинарными файлами или сетевыми протоколами, то вы можете использовать BinaryReader и BinaryWriter. (Если вы обмениваетесь данными с сетями или другими системами, вам нужно помнить endianness, но это другое сообщение.)
Ответ 3
Потоки хороши для работы с большими объемами данных. Когда нецелесообразно одновременно загружать все данные в память, вы можете открыть его как поток и работать с небольшими кусками.
Ответ 4
Существует только один базовый тип Stream
. Однако в некоторых случаях некоторые члены будут вызывать исключение при вызове, потому что в этом контексте операция недоступна.
Например, MemoryStream
- это просто способ перемещения байтов в кусок памяти и из нее. Следовательно, вы можете вызвать "Чтение и запись" на нем.
С другой стороны, FileStream
позволяет вам читать или записывать (или оба) из/в файл. Если вы действительно можете читать или писать, зависит от того, как файл был открыт. Вы не можете писать в файл, если вы только открыли его для чтения.
Ответ 5
Я бы начал с чтения на потоках в MSDN:
http://msdn.microsoft.com/en-us/library/system.io.stream.aspx
Memorystream и FileStream - это потоки, используемые для работы с необработанной памятью и файлами соответственно...
Ответ 6
Поток - это просто абстракция (или оболочка) через поток байтов physical
. Этот поток physical
называется base stream
. Таким образом, всегда существует базовый поток, по которому создается оболочка потока, и, таким образом, оболочка имеет имя после базового типа потока, то есть FileStream
, MemoryStream
и т.д.
Преимущество оболочки потока заключается в том, что вы получаете унифицированный api для взаимодействия с потоками любого базового типа usb, file
и т.д.
Зачем вы обрабатываете данные как поток - поскольку куски данных загружаются по требованию, мы можем проверять/обрабатывать данные как фрагменты, а не загружать все данные в память. Таким образом, большинство программ имеют дело с большими файлами, например, для шифрования файла образа ОС.
Ответ 7
Я бы не назвал эти разные потоки. Класс Stream имеет свойства CanRead и CanWrite, которые говорят вам, может ли конкретный поток считываться и записываться.
Основное различие между различными классами потоков (такими как MemoryStream vs FileStream) является хранилищем резервных копий - где считываются данные или где они записываются. Это очевидно из названия. MemoryStream хранит данные только в памяти, FileStream поддерживается файлом на диске, NetworkStream считывает данные из сети и т.д.
Ответ 8
Ну, вы можете как читать, так и писать в поток в большинстве случаев, memystream - это то, что вы можете объявить, чтобы вы могли работать с данными в памяти, а поток файлов - это поток, указывающий на файл, поэтому, когда вы напишите или прочитайте форму потока файлов, тогда вы читаете/записываете файл.