class RandomAccessDemo { static void Main() {
FileStream f = null; char ch;
try {
f = new FileStream('random.dat', FileMode.Create);
// Записать английский алфавит в файл, for (int i=0; i < 26; i++) f.WriteByte((byte) ('A'+i));
//А теперь считать отдельные буквы английского алфавита. f.Seek(0, SeekOrigin.Begin); // найти первый байт ch = (char) f. ReadByte () ;
Console.WriteLine('Первая буква: ' + ch) ;
f.Seek(l, SeekOrigin.Begin); // найти второй байт ch = (char) f. ReadByte () ;
Console.WriteLine('Вторая буква: ' + ch);
f.Seek(4, SeekOrigin.Begin); // найти пятый байт ch = (char) f.ReadByte() ;
Console.WriteLine('Пятая буква: ' + ch) ;
Console.WriteLine() ;
//А теперь прочитать буквы английского алфавита через одну.
Console.WriteLine('Буквы алфавита через одну: '); for(int i=0; i < 26; i += 2) {
f.Seek(i, SeekOrigin.Begin); // найти i-й символ ch = (char) f.ReadByte() ;
Console.Write(ch + ' ') ;
}
}
catch(IOException exc) {
Console.WriteLine('Ошибка ввода-выводап' + exc.Message);
'} finally {
if(f != null) f.Close();
}
Console.WriteLine() ;
}
}
При выполнении этой программы получается следующий результат.
Перзая буква: А Вторая буква: В Пятая буква: Е
Буквы алфавита, через одну:
АСЕ G‘I KMOQSUWY
Несмотря на то что метод Seek () имеет немало преимуществ при использовании с файлами, существует и другой способ установки текущего положения в файле с помощью свойства Position. Как следует из табл. 14.2, свойство Position доступно как для чтения, так и для записи. Поэтому с его помощью можно получить или же установить текущее положение в файле. В качестве примера ниже приведен фрагмент кода из предыдущей программы записи и чтения из файла с произвольным доступом random.dat, измененный с целью продемонстрировать применение свойства Position.
Console.WriteLine('Буквы алфавита через одну: '); for(int i=0; i < 26; i += 2) {
f.Position = i; // найти i-й символ посредством свойства Position ch = (char) f.ReadByte ();
Console.Write(ch + ' ');
}
Применение класса MemoryStream
Иногда оказывается полезно читать вводимые данные из массива или записывать выводимые данные в массив, а не вводить их непосредственно из устройства или выводить прямо на него. Для этой цели служит класс MemoryStream. Он представляет собой реализацию класса Stream, в которой массив байтов используется для ввода и вывода. В классе MemoryStream определено несколько конструкторов. Ниже представлен один из них:
MemoryStream(byte[ ]
где
В качестве примера ниже приведена программа, демонстрирующая применение класса MemoryStream в операциях ввода-вывода.
