В методе Write()
предпринимается попытка записать в файл количество IOException
. А если базовый поток не открывается для вывода, то генерируется исключение NotSupportedException
. Кроме того, может быть сгенерирован ряд других исключений.
Вам, вероятно, известно, что при выводе в файл выводимые данные зачастую записываются на конкретном физическом устройстве не сразу. Вместо этого они буферизуются на уровне операционной системы до тех пор, пока не накопится достаточный объем данных, чтобы записать их сразу одним блоком. Благодаря этому повышается эффективность системы. Так, на диске файлы организованы по секторам величиной от 128 байтов и более. Поэтому выводимые данные обычно буферизуются до тех пор, пока не появится возможность записать на диск сразу весь сектор. .
Но если данные требуется записать на физическое устройство без предварительного накопления в буфере, то для этой цели можно вызвать метод Flush
.
void Flush()
При неудачном исходе данной операции генерируется исключение IOException
. Если же поток закрыт, то генерируется исключение ObjectDisposedException
.
По завершении вывода в файл следует закрыть его с помощью метода Close()
. Этим гарантируется, что любые выведенные данные, оставшиеся в дисковом буфере, будут записаны на диск. В этом случае отпадает необходимость вызывать метод Flush()
перед закрытием файла.
Ниже приведен простой пример программы, в котором демонстрируется порядок записи данных в файл.
// Записать данные в файл.
using System;
using System.IO;
class WriteToFile {
static void Main(string[] args) {
FileStream fout = null;
try {
// Открыть выходной файл.
fout = new FileStream("test.txt", FileMode.CreateNew);
// Записать весь английский алфавит в файл,
for(char c = 'А'; c <= 'Z'; c++) fout.WriteByte((byte) c);
} catch(IOException exc) {
Console.WriteLine ("Ошибка ввода-вывода: \n" + exc.Message) ;
} finally {
if(fout != null) fout.Close();
}
}
}
В данной программе сначала создается выходной файл под названием test.txt с помощью перечисляемого значения FileMode.CreateNew
. Это означает, что файл с таким же именем не должен уже существовать. (В противном случае генерируется исключение IOException
.) После открытия выходного файла в него записываются
прописные буквы английского алфавита. По завершении данной программы содержимое файла test.txt оказывается следующим.
ABCDEFGHIJKLMNOPQRSTUVWXYZ
Преимущество байтового ввода-вывода средствами класса FileStream
заключается, в частности, в том, что его можно применить к файлам практически любого типа, а не только к текстовым файлам. В качестве примера ниже приведена программа, позволяющая копировать файл любого типа, в том числе исполняемый. Имена исходного и выходного файлов указываются в командной строке
/* Копировать файл.
Чтобы воспользоваться этой программой, укажите имена исходного и выходного файлов. Например, для копирования файла FIRST.DAT в файл SECOND.DAT введите в командной строке следующее:
CopyFile FIRST.DAT SECOND.DAT
*/
using System;
using System.IO;
class CopyFile {
static void Main(string[] args) {
int i;
FileStream fin = null;
FileStream fout = null;
if (args.Length != 2) {
Console.WriteLine("Применение: CopyFile Откуда Куда");
return;
}
try {
// Открыть файлы.
fin = new FileStream(args[0], FileMode.Open);
fout = new FileStream(args[1], FileMode.Create);
// Скопировать файл,
do {
i = fin.ReadByte();
if (i != -1) fout.WriteByte((byte)i);
} while (i != -1);
}
catch (IOException exc) {