IO 101: Которые являются основными отличиями между TextWriter, FileStream и StreamWriter?

Не могли бы вы выполнить какую-либо контрольную сумму результата и сохранить ее локально? Затем, когда ваше приложение запрашивает базу данных, вы можете сравнить ее контрольную сумму и определить, следует ли ее импортировать?

Похоже, что вы можете использовать функцию ORA_HASH для этого.

Обновление: Еще один полезный ресурс: Функция 10RA ORA_HASH для определения того, равны ли данные двух таблиц Oracle

40
задан 2 revs, 2 users 98% 18 June 2009 в 13:11
поделиться

4 ответа

Потоки обрабатывают байтов , писатели обрабатывают символов ].

Байт! = Символы. Для представления символа может потребоваться более одного байта. Преобразование символов в байты называется кодировкой .

A FileStream относится к байтам, записываемым в файл, аналогично тому, как MemoryStream ссылается на в байты, записанные в буфер в памяти. Чтобы записать символы в поток, вам нужно преобразовать их в строку байтов. Вот тут-то и пригодится StreamWriter . Он принимает последовательность символов и кодировку и превращает ее в последовательность байтов.

A TextWriter - это интерфейс (ну, абстрактный базовый класс), которого должны придерживаться все писатели. В нем есть все операции, основанные на персонажах. Эквивалент для байтов - абстрактный базовый класс Stream .

Дела идут и в обратном направлении. Существует абстрактный базовый класс TextReader , описывающий, как читать символы откуда-то, и StreamReader , который позволяет вам читать символы из байтового потока, обеспечивающего кодировку - но это время, используемое в обратном порядке, чтобы агрегировать любые многобайтовые последовательности в отдельные символы, где это необходимо.

Поток может использоваться как для чтения, так и для записи, поскольку байты являются элементами самого низкого уровня, используемыми в I / O операции.

Эквивалент для байтов - абстрактный базовый класс Stream .

Дела идут и в обратном направлении. Существует абстрактный базовый класс TextReader , описывающий, как читать символы откуда-то, и StreamReader , который позволяет вам читать символы из байтового потока, обеспечивающего кодировку - но это время, используемое в обратном порядке, чтобы агрегировать любые многобайтовые последовательности в отдельные символы, где это необходимо.

Поток может использоваться как для чтения, так и для записи, поскольку байты являются элементами самого низкого уровня, используемыми в I / O операции.

Эквивалент для байтов - абстрактный базовый класс Stream .

Дела идут и в обратном направлении. Существует абстрактный базовый класс TextReader , описывающий, как читать символы откуда-то, и StreamReader , который позволяет вам читать символы из байтового потока, обеспечивающего кодировку - но это время, используемое в обратном порядке, чтобы агрегировать любые многобайтовые последовательности в отдельные символы, где это необходимо.

Поток может использоваться как для чтения, так и для записи, поскольку байты являются элементами самого низкого уровня, используемыми в I / O операции.

60
ответ дан 27 November 2019 в 01:30
поделиться

Существует очевидная разница между «потоком» и «писателем / читателем».

Поток - это представление уровня байтов, и на самом деле это абстрактная концепция, которая может быть реализована множеством способов. Например, у вас есть FileStream и MemoryStream. Оба они представляют собой потоки байтов, но хранятся по-разному.

Writers и Readers позволяют обрабатывать потоки, добавлять и извлекать из них данные.

Для ваших конкретных примеров TextWriter - это абстрактный класс, который записывает символы к потоку последовательно. Он имеет несколько реализаций (StreamWriter, StringWriter), которые полезны в разных контекстах. Вы бы использовали то, что имеет смысл в данный момент. Однако для некоторых API все, что нужно, - это TextWriter или что-то, на чем можно будет вызвать «Write» или «WriteLine». Эти API-интерфейсы не заботятся о том, используется ли ваш писатель для помещения данных в строку, произвольную память или файл.

6
ответ дан 27 November 2019 в 01:30
поделиться

Я всегда считал, что лучше всего просто посмотреть, какие методы они предоставляют и как их можно создать. Это почти всегда главное, если не единственное, что меня волнует при использовании API. Как мне его построить и что он умеет?

Вы не можете создать экземпляр TextWriter. Это абстрактно. Это говорит мне, что единственная реальная цель, которую он служит, - это абстракция. Если вы пишете функцию, которая принимает в качестве аргумента любой писатель, есть большая вероятность, что вам следует просто взять TextWriter, чтобы он был более универсальным.

StreamWriter, который вы можете создать, и он делает именно то, что говорит, он записывает в потоки . Это означает, что для реальной записи потребуется поток. Если у вас есть этот поток, вы можете делать всевозможные изящные вещи, например писать целую строку сразу, вместо того, чтобы иметь дело с отдельными символами (или, скорее, байтами), как это делалось бы непосредственно в потоке.

Таким образом, вы получаете поток, чтобы вы могли кормить это в StreamWriter (или Reader). Если вы пишете текст, вы, вероятно, не хотите работать напрямую с потоком, не больше, чем вы хотите работать с символьным массивом вместо строки.

FileStreams можно удобно создавать непосредственно из File и FileInfo классы, и в моем использовании это то, как они обычно создаются. Получите файл (мне нравится использовать FileInfo) и вызовите OpenWrite (). Передайте его StreamWriter (который является просто типом TextWriter), и вы в пути.

В общем: если вы хотите выяснить класс, попробуйте посмотреть, как вы его создаете и что он может делать . Обычно это многое проясняет.

10
ответ дан 27 November 2019 в 01:30
поделиться

Класс FileStream управляет получением дескриптора файла и открытием его для чтения или записи и другими функциями файловой системы. BinaryWriter записывает двоичные данные в поток, а StreamWriter записывает символьные данные в поток. Оба они могут использовать объект FileStream для записи двоичных или символьных данных в файлы.

TextWriter - это базовый класс, от которого наследуется StreamWriter. TextWriter предназначен для получения типа и вывода строки с помощью своего метода Write . Реализация метода TextWriter.Write в StreamWriter записывает строку или символьные данные в поток. BinaryWriter не наследует TextWriter, потому что он не записывает символьные данные в поток.

4
ответ дан 27 November 2019 в 01:30
поделиться
Другие вопросы по тегам:

Похожие вопросы: