Слайд 18Методы FileInfo.OpenText, FileInfo.CreateText, FileInfo.AppendText
FileInfo fs = new FileInfo(@"C:\boot.ini");
StreamReader sReader =
fs.OpenText();
sReader.Close();
FileInfo fs = new FileInfo(@"C:\test.txt");
fs.Open(FileMode.Create,FileAccess.ReadWrite)
StreamWriter sWriter = fs.CreateText();
sWriter.Close();
Слайд 21Работа с объектом FileStream
FileStream s = f2.Open(FileMode.OpenOrCreate, FileAccess.ReadWrite,
FileShare.None);
// Write
20 bytes to the dat file...
for(int i = 0; i
< 256; i++)
{
s.WriteByte((byte)i);
}
// Reset internal position.
s.Position = 0;
// Read 20 bytes from the dat file...
for(int i = 0; i < 256; i++)
{
Console.Write(s.ReadByte());
}
s.Close();
Слайд 22Работа с объектом MemoryStream
// Создаем объект MemoryStream точно определенного объема
MemoryStream
myMemStream = new MemoryStream();
myMemStream.Capacity = 256;
// Записываем байты в myMemStream
for(int
i = 0; i < 256; i++)
{
myMemStream.WriteByte((byte)i);
}
// Переставляем внутренний указатель на начало
myMemStream.Position = 0;
// Считываем байты из потока
for(int i = 0; i < 256; i++)
{
Console.Write(myMemStream.ReadByte());
}
myMemStream.Close();
Слайд 23Наиболее важные члены MemoryStream
FileStream dump= new FileStream("dump.dat",FileMode.Create,FileAccess.ReadWrite);
myMemStream.WriteTo(dump);
byte[ ] bytesinMemory =
myMemStream.ToArray();
myMemStrea.Close();
Слайд 24Класс BufferedStream
// Создаем объект BufferedStream
BufferedStream myFileBuffer
= new BufferedStream(dumpFile);
// Добавляем несколько байт
byte [ ] str =
{127, 0x77, 0x4, 0x0, 0x0, 0x16};
myFileBuffer.Write(str, 0, str.Length);
myFileBuffer.Close(); // Сброс на диск только сейчас
Слайд 25Классы StreamReader и StreamWriter
Object
TextWriter
StreamWriter
StringWriter
TextReader
StreamReader
StringReader
Слайд 26Наиболее важные члены TextWriter
Слайд 27Запись в текстовый файл
// Создаем файл
FileInfo f = new FileInfo("Thoughts.txt");
//
Получаем объект StreamWriter и с его помощью записываем в файл
// несколько строк текста
StreamWriter writer = f.CreateText();
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; i < 10; i++);
{
writer.Write(i + " ");
}
// Вставляем символ начала новой строки
writer.Write(writer.NewLine);
// Метод Close() автоматически очищает все буферы!
writer.Close();
Console.WriteLine("Created file and wrote some thoughts...");
Слайд 28Наиболее важные члены TextReader
Слайд 29Чтение текстового файла
// А теперь выводим информацию из файла на
консоль при помощи
// StreamReader
Console.WriteLine("Here are your thoughts:\n");
StreamReader sr
= File.OpenText("Thoughts.txt");
string input = null;
while ((input = sr.ReadLine()) !=null)
{
Console.WriteLine(input);
}
sr.Close();
string alldata = st.ReadToEnd();
sr.Close();
Слайд 30Класс StringWriter
// Получаем объект StringWriter и с его помощью записываем
// в файл несколько строк текста
StringWriter writer = new
StringWriter();
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; i < 10; i++);
{
writer.Write(i + " ");
}
// Вставляем символ начала новой строки
writer.Write(writer.NewLine);
// Метод Close() автоматически очищает все буферы!
writer.Close();
Console.WriteLine("Stored thoughts in a StringWriter...");
// Получаем копию содержимого StringBuffer (в виде значения типа string)
// и выводим ее на консоль
Console.WriteLine("Contents: {0}", writer.ToString());
Слайд 31Доступ через StringWriter.GetStringBuilder()
// Получаем объект StringBuilder и выводим его содержимое
StringBuilder str = writer.GetStringBuilder();
string allOfTheData = str.ToString();
Console.WriteLine("StringBuilder says:\n{0} ", allOfTheData);
//
Вставляем в буфер новый элемент, позиция вставки 20
str.Insert(20, "INSERTED STUFF");
allOfTheData = str.ToString();
Console.WriteLine("New StringBuilder says:\n{0}", allOfTheData);
// Удаляем вставленный элемент
str.Remove(20, "INSERTED STUFF".Length);
allOfTheData = str.ToString();
Console.WriteLine("Original says:\n{0}", allOfTheData);
Слайд 32Доступ через StringWriter.GetStringBuilder()
// Получаем объект StringBuilder и выводим его содержимое
StringBuilder str = writer.GetStringBuilder();
string allOfTheData = str.ToString();
Console.WriteLine("StringBuilder says:\n{0} ", allOfTheData);
//
Вставляем в буфер новый элемент, позиция вставки 20
str.Insert(20, "INSERTED STUFF");
allOfTheData = str.ToString();
Console.WriteLine("New StringBuilder says:\n{0}", allOfTheData);
// Удаляем вставленный элемент
str.Remove(20, "INSERTED STUFF".Length);
allOfTheData = str.ToString();
Console.WriteLine("Original says:\n{0}", allOfTheData);
Слайд 33Доступ через StringWriter.GetStringBuilder()
StringReader sr = new StringReader(writer.ToString());
string input = null;
while
((input = sr.ReadLine()) != null)
{
Console.WriteLine (input);
}
sr.Close();
Слайд 34Наиболее важные члены BinaryWriter
Наиболее важные члены BinaryReader
Слайд 35Запись двоичных файлов
FileStream myFStream = new FileStream("temp.dat",
FileMode.OpenOrCreate, FileAccess.ReadWrite);
// Записываем двоичные данные
BinaryWriter binWrit = new BinaryWriter(myFStream);
binWrit.WriteString("Hello as binary info...");
int myInt = 99;
float myFloat = 9984.82343F;
bool myBool = false;
char[] myCharArray = {'H', 'e', 'l', 'l', 'o'};
binWrit.Write(myInt);
binWrit.Write(myFloat);
binWrit.Write(myBool);
binWrit.Write(myCharArray);
Слайд 36Чтение двоичных файлов
// Устанавливаем внутренний указатель на начало
binWrit.BaseStream.Position = 0;
//
Считываем двоичную информацию как поток байтов
Console.WriteLine("Reading binary data...");
BinaryReader binRead =
new BinaryReader(myFStream);
int temp = 0;
while(binRead.PeekChar() != -1)
{ Console.Write(binRead.ReadByte());
temp = temp + 1;
if(temp = = 5)
{ // Добавляем пустую строку через каждые 5 байтов
temp = 0;
Console.WriteLine();
}
}
// Все закрываем
binWrit.Close(); binRead.Close(); myFStream.Close();
Слайд 37Вывод стандартных объектов
// Открываем файл изображения в каталоге приложения
Console.WriteLine("Modifying a
bitmap in memory");
myFStream = new FileStream("Paint Splatter.bmp", FileMode.Open, FileAccess.ReadWrite);
// Создаем
объект Bitmap на основе открытого потока
Bitmap rawBitmap = new Bitmap(myFStream);
// Рисуем белый крест поперек изображения (наш код применим лишь в том
// случае, если высота и ширина изображения одинаковы)
for(int i = 0; i < rawBitmap.Width; i++)
{
rawBitmap.SetPixel(i, i, Color.White);
rawBitmap.SetPixel(rawBitmap.Width - i) - 1, i - 1, Color.White);
}
// А теперь сохраняем измененное изображение в файл
rawBitmap.Save("newImage.bmp");
myFStream.Close();
Слайд 38Сохранение объектов .NET
Сериализация – процесс преобразования объекта в линеную последовательность
байт
Сериализация подразумевает сохранение информации и родительских объектах
Слайд 39Настройка объектов для сериализации
// Класс Radio может быть сериализован
[Serializable]
public class
Radio
{
// Однако нам нет необходимости сохранять это число
[NonSerialized]
private int objectIDNumber
= 9;
public Radio(){}
public void On(bool state)
{
if(state = = true)
MessageBox.Show("Music is on...");
else
MessageBox.Show("No tunes...");
}
}
Слайд 40Сериализация в двоичном формате
using System.Runtime.Serialization.Formatters.Binary;
public static void Main()
{
// Создаем объект
JamesBondCar и выполняем с ним всякие действия
JamesBondCar myAuto =
new JamesBondCar("Fred", 50, false, true);
myAuto.TurnOnRadio(true);
myAuto.GoUnderWater();
// Создаем поток для записи в файл
FileStream myStream = File.Create("CarData.dat");
// Помещаем объектный граф в поток в двоичном формате
BinaryFormatter myBinaryFormat = new BinaryFormatter();
myBinaryFormat.Serialize(myStream, myAuto);
myStream.Close();
...
}
Слайд 42Десериализация в двоичном формате
using System.Runtime.Serialization.Formatters.Binary;
public static void Main()
{
myStream = FileOpenRead("CarData.dat");
JamesBondCar
carFromDisk =
(JamesBondCar) myBinaryFormat.Deserialize(myStream);
Console.WriteLine(CarFromDisk.PetName);
CarFromDisk.TurnOnRadio(true);
myStream.Close();
}
Слайд 43Сериализация в формате SOAP
using System.Runtime.Serialization.Formatters.Soap;
// Сохраняем тот же самый объект
в формате SOAP
FileStream myStream = File.Create("CarData.xml");
SoapFormatter myXMLFormat = new SoapFormatter();
myXMLFormat.Serialize(myStream,
myAuto);
myStream.Close();
// Восстанавливаем объект из файла SOAP
myStream = File.OpenRead("CarData.xml");
JamesBondCar carFromXML = (JamesBondCar)myXMLFormat.Deserialize(myStream);
Console.WriteLine(carFromXML.PetName + " is alive!");
myStream.Close();
Слайд 44Результирующий XML-файл
false
true
id="ref-3">Fred
50
50
Слайд 45Пользовательская сериализация
// Интерфейс ISerializable
public interface ISerializable
{
public virtual void GetObjectData
(Serialization
info, SreamingContext context);
}
// Специальный конструктор для десериализации
Class SoeClass
{
private SomeClass
(Serialization si, SreamingContext ctx) { … }
}
Слайд 46Класс SerializationInfo
AddValue() – многократно перегружен
GetXXXX() – GetString, GetInt32 …
Слайд 47Простой пример пользовательской сериализации
public class CustomCarType : ISerializable
{ public string petName;
public
int maxSpeed;
public CustomCarType(string s, int i) { petName = s;
maxSpeed = i; }
// Передаем информацию о состоянии объекта объекту Formatter
public void GetObjectData(SerializationInfo si, StreamingContext ctx)
{
// Каков тип нашего потока?
Console.WriteLine("[GetObjectData] Context State: {0}", ctx.State.Format());
si.AddValue("CapPetName", petName);
si.AddValue("MaxSpeed", maxSpeed);
}
// А теперь позаботимся о специальном варианте конструктора
private CustomCarType(SerializationInfo si, StreamingContext ctx)
{
// Каков тип нашего потока?
Console.WriteLine("[ctor] Context State: {0}", ctx.State.Format());
petName = si.GetString("CapPetName");
maxSpeed = si.GetInt32("maxSpeed");
}
}
Слайд 48Простой пример пользовательской сериализации
public static int Main(string[] args)
{
CustomCarType myAuto =
new CustomCarType("Siddhartha", 50);
Stream myStream = File.Create("CarData.dat");
// Задействуем интерфейс ISerializable
BinaryFormatter myBinaryFormat
= new BinaryFormatter();
myBinaryFormat.Serialize(myStream, myAuto);
myStream.Close();
myStream = File.OpenRead("CarData.dat");
// Вызываем спецконструктор
CustomCarType carFromDisk =
(CustomCarType)myBinaryFormat.Deserialize(myStream);
Console.WriteLine(carFromDisk.petName + " is alive!");
return 0;
}
Слайд 49Использование диалога Open
protected void menuItemOpen_Click (object sender, System.EventArgs e)
{
// Настраиваем
свойства диалогового окна для открытия файлов
OpenFileDialog myOpenFileDialog = new
OpenFileDialog();
myOpenFileDialog.InitialDirectory = ".";
myOpenFileDialog.Filter = "car files (*.car)|*.car|All files(*.*)|*.*";
myOpenFileDialog.FilterIndex = 1;
myOpenFileDialog.RestoreDirectory = true;
// Восстанавливаем объекты автомобилей
if(myOpenFileDialog.ShowDialog() = = DialogResult.OK)
{ // Очищаем текущий массив
arTheCars.Clear();
Stream myStram = null;
if((myStream = myOpenFileDiaog.OpenFile()) != null)
{
BinaryFormatter myBinaryFormat = new BinaryFormatter();
arTheCars = (ArrayList)myBinaryFormat.Deserilize(myStream);
myStream.Close();
UpdateGrid();
}
}
}
Слайд 50Использование диалога Save As
protected void menuItemSave_Click (object sender, System.EventArgs e)
{
//
Настраиваем свойства диалогового окна для сохранения файлов
SaveFileDialog mySaveFileDialog =
new SaveFileDialog();
mySaveFileDialog.InitialDirectory = ".";
mySaveFileDialog.Filter = "car files (*.car)|*.car|All files(*.*)|*.*";
mySaveFileDialog.FilterIndex = 1;
mySaveFileDialog.RestoreDirectory = true;
mySaveFileDialog..FileName = "carDoc";
// Сохраняем объекты автомобилей
if(mySaveFileDialog.ShowDialog() = = DialogResult.OK)
{
Stream myStram = null;
if((myStream = mySaveFileDiaog.OpenFile()) != null)
{
BinaryFormatter myBinaryFormat = new BinaryFormatter();
myBinaryFormat.Serialize(myStream, arTheCars);
myStream.Close();
}
}
}