Файловый ввод-вывод и сериализация объектов_2

advertisement
26) Листинг 8.9
static void Main(string[] arqs)
{
// Получить объект FileStream через File.Create() .
using(FileStream fs = File.Create(@"C:\Test.dat"))
{}
// Получить объект FileStream через File.Open().
using(FileStream fs2 = File.Open(@"C:\Test2.dat",
FileMode.OpenOrCreate,
FileAccess.ReadWrite,
FileShare.None))
{}
// Получить объект FileStream с правами только для
чтения.
using(FileStream readOnlyStream =
File.OpenRead(@"Test3.dat"))
{ }
//Получить объект FileStream с правами только для записи.
using(FileStream writeOnlyStream =
File.OpenWrite(@"Test4.dat") )
{}
// Получить объект StreamReader.
using(StreamPeader sreader =
File.OpenText(@"C:\boot.mi"))
{}
// Получить несколько объектов StreamWriter.
using (StreamWriter swriter =
File.CreateText(@"C:\Test6.txt"))
{}
using(StreamWriter swriterAppend =
File.AppendText(@"C:\FinalTest.txt")) {}
}
Таблица 8.6 – Методы типа File
Метод
Назначение
Открывает указанный файл, возвращает двоичные данные в
виде массива байт и затем закрывает файл
Открывает указанный файл, возвращает символьные данные
ReadAllLines()
в виде массива строк, затем закрывает файл
Открывает указанный файл, возвращает символьные данные
ReadAllText()
в виде System.String, затем закрывает файл
Открывает указанный файл, записывает в него байтовый
WriteAllBytes()
массив и закрывает файл
Открывает указанный файл, записывает в него массив строк
WriteAllLines()
и закрывает файл
Открывает указанный файл, записывает в него данные из
WriteAllText()
указанной строки и закрывает файл
ReadAllBytes()
28) Листинг 8.10
class Program
{
static void Main(stnng[] args)
{
Console.WriteLine (
"***** Simple 10 with the File Type *****\n");
string [] myTasks = {
"Fix bathroom sink", "Call Dave",
"Call Mom and Dad", "Play Xbox 360"};
// Записать все данные в файл на диске С.
File.WriteAllLines(@"С:\tasks.txt", myTasks);
// Прочитать все обратно и распечатать.
foreach (string task in
File.ReadAllLines(@"С:\tasks.txt"))
{
Console.WriteLine("TODO: {0}", task);
}
Console.ReadLine();
}
}
Член
CanRead
CanWrite
CanSeek
Close()
Flush()
Length
Position
Read()
ReadByte()
Seek()
SetLength()
Write()
WriteByte()
Назначение
Определяют, поддерживает ли текущий поток чтение, запись или
поиск
Закрывает текущий поток и освобождает все ресурсы (такие как
сокеты и файловые дескрипторы), ассоциированные с текущим
потоком. Внутренне этот метод является псевдонимом метода
Dispose(). Поэтому закрытие потока функционально эквивалентно
освобождению потока
Обновляет лежащий в основе источник данных или репозиторий
текущим состоянием буфера с последующей очисткой буфера.
Если поток не реализует буфер, метод ничего не делает
Возвращает длину потока в байтах
Определяет текущую позицию в потоке
Читает последовательность байт (или одиночный байт) из
текущего потока и перемещает текущую позицию потока на
количество прочитанных байтов
Устанавливает позицию в текущем потоке
Устанавливает длину текущего потока
Пишет последовательность байт (или одиночный байт) в текущий
поток и перемещает текущую позицию потока на количество
записанных байтов
30) Листинг 20.10
// Не забудьте импортировать пространства имен System.Text и
System.IO!
static void Main(string[] args)
{
Console.WriteLine("*****
Fun
with
FileStreams
*****\n");
// Получить объект FileStream.
using(FileStream fStream =
File.Open(@"C:\myMessage.dat",FileMode.Create))
{
// Закодировать строку в виде массива байт.
string msg = "Hello!";
byte[] msgAsByteArray =
Encoding.Default.GetBytes(msg);
// Записать byte[] в файл.
fStream.Write(msgAsByteArray,
0,
msgAsByteArray.Length);
// Сбросить внутреннюю позицию потока.
fStream.Position = 0;
// Прочитать типы из файла и вывести на консоль.
for (int i = 0; i < msgAsByteArray.Length; i++)
{
bytesFromFile[l] = (byte)fStream.ReadByte();
Console.Write(bytesFromFile[i]);
}
// Вывести декодированные сообщения.
Console.Write("\nDecoded Message: " ) ;
Console.WriteLine(Encoding.Default.GetString(
bytesFromFile));
}
Console.ReadLine();
}
Таблица 8.8 – Основные члены TextWriter
Член
Назначение
Close()
Этот метод закрывает объект-писатель и освобождает все
связанные с ним ресурсы. В процессе автоматически
сбрасывается буфер (этот член функционально эквивалентен
методу Dispose())
Flush()
Этот метод очищает все буферы текущего объекта-писателя и
записывает все буферизированные данные на лежащее в
основе устройство, но не закрывает его
NewLine
Это свойство задает константу перевода строки для
унаследованного
класса
писателя.
По
умолчанию
ограничителем строки в Windows является возврат каретки, за
которым следует перевод строки (\r\n)
Write()
WriteLine()
Этот перегруженный метод записывает данные в текстовый
поток без добавления константы новой строки
Этот перегруженный метод записывает данные в текстовый
поток с добавлением константы новой строки
33) Листинг 20.11
static void Main(string[] args)
{
Console.WriteLine(
***** Fun with StreamWriter/StreamReader *****\n");
// Получить StreamWriter и записать строковые данные.
using(StreamWriter writer
= File.CreateText("reminders.txt"))
{
writer.WriteLine("Don't forget Mother's Day this
year...");
writer.WriteLine("Don't forget Father's Day this
year...");
writer.WriteLine("Don't forget these numbers:");
for(int i = 0; l < 10; i++)
writer.Write (i + " ") ;
// Вставить новую строку.
writer.Write(writer.NewLine);
}
Console.WriteLine("Created
file
and
wrote
some
thoughts...");
Таблица 8.9 – Основные члены TextReader
Член
Назначение
Peek()
Возвращает следующий доступный символ, не изменяя текущей
позиции читателя. Значение -1 указывает на достижение конца
потока
Read()
Читает данные из входного потока
ReadBlock()
Читает указанное максимальное количество символов из текущего
потока и записывает данные в буфер, начиная с заданного индекса
Читает строку символов из текущего потока и возвращает данные в
виде строки (null-строка указывает на признак конца файла (EOF))
Читает все символы от текущей позиции до конца потока и
возвращает их в виде одной строки
ReadLine()
ReadToEnd()
35) Листинг 8.13
static void Main(string [] args)
{
Console. WriteLine (
"***** Fun with StreamWriter/StreamReader *****\n");
// Прочитать данные из файла.
Console.WriteLine("Here are your thoughts:\n");
using(StreamReader sr =
File.OpenText("reminders.txt"))
{
string input = null;
while ( (input = sr.ReadLine()) != null)
{
Console.WriteLine (input);
}
}
Console.ReadLine();
}
36) Листинг 8.14
static void Main(string[] args)
{
Console.WriteLine (
"*****
Fun
with
StreamWriter/StreamReader
*****\n");
// Получить StreamWriter и записать строковые
данные.
using(StreamWriter writer =
new StreamWriter("reminders.txt"))
{
...
}
// Прочитать данные из файла.
using (StreamReader sr =
new StreamReader("reminders.txt"))
{
...
}
}
37) Листинг 8.15
static void Main (string[] args)
{
Console.WriteLine(
"***** Fun with StringWriter/StringReader *****\n");
// Создать StringWriter и записать символьные
// данные в память.
using(StringWriter strWriter = new StringWriter())
{
strWriter.WriteLine(
"Don't forget Mother's Day this year...");
// Получить копию содержимого (хранящегося
// в строке) и вывести на консоль.
Console.WriteLine (
"Contents of StringWriter:\n{0}", strWriter);
}
Console.ReadLine();
}
38) Листинг 8.16
using (StringWriter strWriter = new StringWriter ())
{
strWriter.WriteLine(
"Don't forget Mother's Day this year...");
Console.WriteLine(
"Contents of StringWriter:\n{0}", strWriter);
// Получить внутренний StringBuilder.
StringBuilder sb = strWriter.GetStringBuilder();
sb.Insert (0, "Hey!! ") ;
Console.WriteLine ("-> {0}", sb.ToString());
sb.Remove (0, "Hey!! ".Length);
Console.WriteLine ("-> {0}", sb.ToString());
}
39) Листинг 8.17
using (StringWriter strWriter = new StringWriter())
{
strWriter.WriteLine (
"Don't forget Mother's Day this year...");
Console.WriteLine(
"Contents of StringWriter:\n(0}", strWriter);
// Читать данные из StringWriter.
using (StringReader strReader =
new StringReader(strWriter.ToString()))
{
string input = null;
while ( (input = strReader.ReadLine()) !=null)
{
Console.WriteLine(input);
}
}
}
Таблица 8.10 – Основные члены BinaryWriter
Член
Назначение
BaseStream
Это свойство, предназначенное только для
обеспечивает доступ к лежащему в основе
используемому объектом BinaryWriter
Close()
Этот метод закрывает двоичный поток
Flush()
Этот метод выталкивает буфер двоичного потока
Seek()
Этот метод устанавливает позицию в текущем потоке
Write()
Этот метод пишет значение в текущий поток
чтения,
потоку,
Таблица 8.11 – Основные члены BinaryReader
Член
BaseStream
Назначение
Это свойство, предназначенное только для
обеспечивает доступ к лежащему в основе
используемому объектом BinaryReader
Close()
Этот метод закрывает двоичный поток
PeekChar()
Этот метод возвращает следующий доступный символ без
перемещения текущей позиции потока
Этот метод читает заданный набор байт или символов и
сохраняет их в переданном ему массиве
Read()
ReadXXXX()
чтения,
потоку,
В классе BinaryReader определено множество методов чтения,
которые извлекают из потока объекты различных типов
(ReadBoolean(), ReadByte(), ReadInt32() и т. д.)
42) Листинг 8.18
static void Main(string [] args)
{
Console. WriteLine (
"***** Fun with Binary Writers / Readers *****\n");
// Открыть двоичную запись в файл.
Filelnfo f = new Filelnfо("BinFile.dat") ;
using (BinaryWriter bw = new BinaryWriter (f.OpenWnte ()) )
{
//
Вывести
на
консоль
тип
BaseStream
(System.10.FileStream
// в данном случае).
Console.WriteLine("Base stream is: {0}", bw.BaseStream);
// Создать некоторые данные для сохранения в файле.
double aDouble = 1234.67;
int anInt = 34567;
string aString = "А, В, C";
// Записать данные.
bw.Write(aDouble);
bw.Write(anlnt);
bw.Write(aString);
}
Console.ReadLine() ;
}
43) Листинг 8.19
static void Main(string[] args)
{
Filelnfo f = new Filelnfо("BinFile.dat");
// Читать двоичные данные из потока.
using(BinaryReader br =
new BinaryReader(f.OpenRead()) )
{
Console.WriteLine(br.ReadDouble());
Console.WriteLine(br.Readlnt32());
Console.WriteLine(br.ReadString());
}
Console.ReadLine() ;
}
44)
public enum NotifyFilters
{
Attributes, CreationTime,
DirectoryName, FileName,
LastAccess, LastWrite,
Security, Size,
}
45)
// Делегат FileSystemEventHandler должен указывать
// на метод, соответствующий следующей сигнатуре.
void MyNotificationHandler(object source,
FileSystemEventArgs e)
46)
// Делегат RenamedEventHandler должен указывать
//на метод, соответствующий следующей сигнатуре.
void MyNotificationHandler(object source,
RenamedEventArgs e)
47) Листинг 8.20
static void Main(string[] args)
{
Console.WriteLine (
"***** The Amazing File Watcher App *****\n");
// Установить путь к каталогу, за которым нужно наблюдать.
FileSystemWatcher watcher = new FileSystemWatcher();
try
{
watcher.Path = @"C:\MyFolder";
}
catch(ArgumentException ex)
{
Console.WriteLine(ex.Message);
return;
}
// Указать предметы наблюдения.
watcher.NotifyFilter = NotifyFilters.LastAccess
| NotifyFilters.LastWrite
| NotifyFilters.FileName
| NotifyFilters.DirectoryName;
// Следить только за текстовыми файлами.
watcher.Filter = "*.txt";
// Добавить обработчики событий.
watcher.Changed +=
new FileSystemEventHandler(OnChanged);
watcher.Created +=
new FileSystemEventHandler(OnChanged);
watcher.Deleted +=
new FileSystemEventHandler(OnChanged);
watcher.Renamed +=
new RenamedEventHandler(OnRenamed);
// Начать наблюдение за каталогом.
watcher.EnableRaisingEvents = true;
// Ожидать команды пользователя на завершение программы.
Console.WriteLine(@"Press 'q' to quit app.");
while(Console.Read()!='q');
}
48)
static void OnChanged(object source,
FileSystemEventArgs e)
{
// Показать, что сделано, если файл изменен,
// создан или удален.
Console.WriteLine ("File: {0} {1}'", e.FullPath,
e.ChangeType);
}
static void OnRenamed(object source,
RenamedEventArgs e)
{
// Показать, что файл был переименован.
Console.WriteLine("File: {0} renamed to\n{1}" ,
e.OldFullPath, e.FullPath);
}
49)
***** The Amazing File Watcher App *****
Press 'q' to quit app.
File: C:\MyFolder\New Text Document.txt Created!
File: C:\MyFolder\New Text Document.txt renamed to
C:\MyFolder\Hello.txt
File: C:\MyFolder\Hello.txt Changed!
File: C:\MyFolder\Hello.txt Changed!
File: C:\MyFolder\Hello.txt Deleted'
Download