Потоки ввода/вывода. Система ввода/вывода обеспечивает для программиста стандартные и не зависящие от физического устройства средства представления информации.

Презентация:



Advertisements
Похожие презентации
Атрибуты Работа с файлами Сериализация Лекция 9. Атрибуты Работа с файлами Сериализация.
Advertisements

Атрибуты Работа с файлами Сериализация Лекция 11.
Работа с файлами.. Процедура Assign(var f; name : String); Связывает внешний файл с именем name и переменную файлового типа f. Все дальнейшие операции.
Работа со строками Работа с файлами Лекция 7. Работа со строками Работа с файлами.
Click to edit Master title style IDK1011 Основы программирования Диалоговые окна Чтение файлов и директорий.
Основы ООП и C# Работа с объектами и классами. Классы Класс специальный тип данных для описания объектов. Он определяет данные и поведение типа. Определение.
Работа с файлами Сазонов Д.О. ПМиЭММ Часть 2. Тема занятия: Работа с файлами через потоки Для реализации файлового ввода/вывода, необходимо включить в.
Ввод-вывод в C# Сериализация. Сохранение объектов в.NET В терминах.NET сериализация (serialization) это термин, описывающий процесс преобразования объекта.
Классы в С#. Перечисления С# Перечисление задает конечное множество возможных значений, которые могут получать объекты класса перечисление. [атрибуты][модификаторы]
Java in pictures. Part 3.
Работа с файлами. Операции с файлами Для того чтобы можно было читать из файла или писать в файл, он должен быть предварительно открыт с помощью библиотечной.
Отправка файла с использованием электронной почты.
Обработка исключений Работа с файлами Лекция 8. Обработка исключений Работа с файлами Работа с файловой системой Операции с потоками.
Лекция 11 Файлы. Точного определения файла не существует. Файлом может быть: Объект файловой системы (файлы, папки и т.д.) Устройство ввода/вывода (клавиатура,
Массивы в С#. Массивом называют упорядоченную последовательность элементов одного типа. Каждый элемент массива имеет индексы, определяющие порядок элементов.
Методы классов. Методы класса [атрибуты][модификаторы] {void|тип_результата_функции} имя_метода ([список_формальных_аргументов]) { тело метода} Список.
1 ©Павловская Т.А. (СПбГУ ИТМО) Структуры данных Контейнерные классы Работа с файлами.
ПРОГРАММИРОВАНИЕ/ ЯЗЫКИ ПРОГРАММИРОВАНИЯ Лекция 4 Работа с бинарными файлами (весенний семестр 2012 г.) Доцент Кафедры вычислительных систем, к.т.н. Поляков.
1 Файловый тип данных Файл – это область памяти на внешнем носителе, в которой хранится некоторая информация. Файл – это набор данных, хранящихся во внешней.
Файлы - именованная область внешней памяти ЭВМ, хранящая совокупность данных. Файл.
Транксрипт:

Потоки ввода/вывода

Система ввода/вывода обеспечивает для программиста стандартные и не зависящие от физического устройства средства представления информации и управления потоками ввода/вывода. Потоки бывают: Байтовые – базовый класс Stream Символьные – базовые классы TextReader и TextWriter Двоичные – базовые классы BinaryReader и BinaryWriter

Общие методы потоков bool CanRead - можно ли читать из потока ; bool CanWrite - можно ли писать в поток ; bool CanSeek - можно ли задать в потоке текущую позицию; long Position - текущая позиция элемента потока; long Length - общее количество символов потока; int ReadByte() - чтение байта из потока; int Read(byte[] buff, int index, int count) - чтение определенного количества байтов из потока; void WriteByte(byte b) – запись одного байта в поток; int Write(byte[] buff, int index, int count) - запись определенного количества байтов из потока; long Seek (long index, SeekOrigin origin) – позиционирование в потоке; void Flush() - запись содержимого буфера потока на физическое устройство; void Close() – закрытие потока

Байтовые потоки BufferedStream – обеспечивает буферизацию байтового потока. FileStream – байтовый поток, обеспечивающий файловые операции ввода/вывода; MemoryStream – байтовый поток, использующий в качестве источника и хранилища информации оперативную память.

Символьные потоки StreamReader – содержит свойства и методы, обеспечивающие считывание символов из байтового потока; StreamWriter – содержит свойства и методы, обеспечивающие запись символов в байтовый поток; StringWriter – для записи текстовой информации в буфер оперативной памяти; StringReader – для чтения текстовой информации из буфера оперативной памяти;

Общие методы символьных потоков Для класса TextReader: int Peek() – считывает следующий знак, не изменяя состояние средства чтения; int Read() чтение из потока одного символа; int Read (char[] buff, int index, int count), int ReadBlock(char[] buff, int index, int count) - чтение символов из потока и запись данных в буфер String ReadLine() – читает строку символов из текущего потока; String ReadToEnd() – читает все символы, начиная с текущей позиции символьного потока. Для класса TextWriter: void Write(char c) запись в поток одного символа; void Write(char[] buff, int index, int count) - запись символов в поток из буфера; void WriteLine() – запись строки символов в текущий поток;

Методы двоичных потоков Методы BinaryWriter void Write(...} void Write(byte[] Buff, int index, int count) void Write(char[] Buff, int index, int count) long Seek(tnt Offset, SeekOrigin so) void Flush() void Close() Методы BinaryReader (выборочно) bool ReadBoolean() byte ReadByte() byte[] ReadBytes(int iCount) sbyte ReadSByte() char ReadChar() char[] ReadChars(int iCount) short Readlnt16() int Readlnt32() long Readlnt64() ushort ReadUInt16() uint ReadUInt32() ulong ReadUInt64() float ReadSingle() double ReadDouble() decimal ReadDecimal() Int PeekChar() int Read() void Read(char[] Buff, int index, int count) void Read(byte[] Buff, int index, int count) void Close()

Файловый ввод/вывод FileStream – обеспечивает произвольный доступ к файлу, представляемому как поток байтов. Перечисление FileAttributes - атрибуты файла. Перечисление FileMode - возможные способы открытия файла. Перечисление FileAccess содержит константы, показывающие, открыт ли файл для чтения, записи и др.

FileMode enumeration Значение Описание AppendОткрывается существующий файл и выполняется поиск конца файла или же создается новый файл. FileMode.Append можно использовать только вместе с FileAccess.Write. CreateСоздает новый файл. Если файл уже существует, он будет переписан. CreateNewСоздает новый файл. OpenОткрывает существующий файл. Возможность открыть данный файл зависит от значения, задаваемого FileAccess. OpenOrCrea te Открывает файл, если он существует, в противном случае должен быть создан новый файл. TruncateОткрывает существующий файл. После открытия должно быть выполнено усечение файла таким образом, чтобы его размер стал равен нулю.

FileAccess enumerations ЗначениеОписание ReadДоступ к файлу для чтения. Данные могут быть прочитаны из файла. ReadWriteДоступ к файлу для чтения/записи WriteДоступ к файлу для записи. Данные могут быть записаны в файл.

Перечисление FileShare Значение Описание NoneСовместное использование открытого файла запрещено. На любой запрос на открытие данного файла будет возвращено сообщение об ошибке ReadПозволяет открывать файл одновременно и другим пользователям, но только на чтение. Если этот флаг не установлен, на любые запросы на открытие данного файла на чтение будет возвращаться сообщение об ошибке ReadWriteПозволяет открывать файл одновременно и другим пользователям на чтение и запись WriteПозволяет открывать файл одновременно и другим пользователям на запись

static void Main(string[] args) { byte[] data = new byte[10]; FileStream fs = new FileStream("FileStreamTest.txt", FileMode.OpenOrCreate); if (fs.Length == 0) { Console.WriteLine("Writing Data..."); for (short i = 0; i < 10; i++) data[i] = (byte)i; fs.Write(data, 0, 10); // Запись данных } else { fs.Seek(-5, SeekOrigin.End); // Ищем конец int count = fs.Read(data, 0, 10); // Чтение данных for (int i = 0; i < count; i++) Console.WriteLine(data[i]); } fs.Close(); }

Символьные потоки static void Main(string[] args) { FileStream fs = new FileStream("TextTest.txt", FileMode.OpenOrCreate); if (fs.Length == 0) { Console.WriteLine("Writing Data..."); // Запись данных StreamWriter sw = new StreamWriter(fs); sw.Write(100); sw.WriteLine(" One Hundred"); sw.WriteLine("End of File"); sw.Close(); } else { String text; StreamReader sr = new StreamReader(fs); text = sr.ReadLine(); // текст while (text != null) { Console.WriteLine(text); text = sr.ReadLine(); } sr.Close(); } fs.Close(); }

Двоичные потоки static void Main(string[] args) { FileStream fs = new FileStream("BinaryTest.bin", FileMode.OpenOrCreate); if (fs.Length == 0) { Console.WriteLine("Writing Data..."); BinaryWriter w = new BinaryWriter(fs); for (short i = 0; i < 10; i++) w.Write(i); // Запись w.Close(); } else { BinaryReader r = new BinaryReader(fs); for (int i = 0; i < 10; i++) Console.WriteLine(r.ReadInt16()); r.Close(); } fs.Close() }

Классы для работы с папками и файлами static void Main(string[] args) { Directory.CreateDirectory("C:\\my"); if(Directory.Exists("C:\\my1")) Console.WriteLine("Папка \"my1\" существует"); else Console.WriteLine("Папка \"my1\" не существует"); Directory.Move( "C:\\my", "C:\\my2"); Directory.Delete( "C:\\my2"); }

Методы класса FileInfo ЧленОписание AppendText()Создает объект StreamWriter для добавления текста к файлу CopyTo()Копирует уже существующий файл в новый файл Create()Создает новый файл и возвращает объект FileStream для взаимодействия с этим файлом CreateText()Создает объект StreamWriter для записи текстовых данных в новый файл Delete()Удаляет файл, которому соответствует объект Filelnfo Directory Возвращает каталог, в котором расположен данный файл DirectoryName() Возвращает полный путь к данному файлу в файловой системе Length Возвращает размер файла MoveTo() Перемещает файл в указанное пользователем место (этот метод позволяет одновременно переименовать данный файл) NameПозволяет получить имя файла Ореn()Открывает файл с указанными пользователем правами доступа на чтение, запись или совместное использование с другими пользователями OpenRead()Создает объект FileStream, доступный только для чтения OpenText()Создает объект StreamReader, который позволяет считывать информацию из существующего текстового файла OpenWrite()Создает объект FileStream, доступный для чтения и записи

static void Main(string[] args) { File.Delete("file2.txt"); StreamWriter sw = File.CreateText("file.txt"); sw.Write ("The time has come the Walrus said, "); sw.WriteLine("to talk of many things."); sw.Close(); File.Move("file.txt", "file2.txt"); FileInfo fileInfo = new FileInfo("file2.txt"); Console.WriteLine( "File {0} is {1} bytes in length, created on {2}", fileInfo.FullName,fileInfo.Length, fileInfo.CreationTime); Console.WriteLine(""); StreamReader sr = fileInfo.OpenText(); String s = sr.ReadLine(); while (s != null) { Console.WriteLine(s); s = sr.ReadLine(); } sr.Close(); Console.WriteLine(""); }

Буферизация потоков private void Run() { FileStream inputStream = File.OpenRead("D:\\test.txt"); FileStream outputStream = File.OpenWrite("D:\\text.txt"); // создать буфер для хранения байтов BufferedStream bsr = new BufferedStream(inputStream); BufferedStream bsw = new BufferedStream(outputStream); byte[] buffer = new byte[SizeBuff]; int bytesRead; while( (bytesRead= bsr.Read(buffer,0,SizeBuff))>0) bsw.Write(buffer,0,bytesRead); bsw.Flush(); bsr.Close(); bsw.Close(); }

Сериализация объектов Под сериализацией понимают процесс сохранения объектов в долговременной памяти (файлах) в период выполнения системы. Под десериализацией понимают обратный процесс - восстановление состояния объектов, хранимых в долговременной памяти. Два формата сохранения данных - в бинарном файле и XML-файле. System.Runtime.Serialization.Formatters.Binary System.Xml.Serialization [Serializable] public class Test { public string name; [NonSerialized] int id; int age; //другие поля и методы класса }

[Serializable] public class Personage { public Personage(string name, int age) { this.name = name; this.age = age; } static int wishes; public string name, status, wealth; int age; public Personage couple; //методы класса public void marry (Personage couple){ this.couple = couple; couple.couple = this; this.status ="крестьянин"; this.wealth ="рыбацкая сеть"; this.couple.status = "крестьянка"; this.couple.wealth = "корыто"; SaveState(); } void SaveState(){ BinaryFormatter bf = new BinaryFormatter(); FileStream fs = new FileStream ("State.bin",FileMode.Create, FileAccess.Write); bf.Serialize(fs,this); fs.Close(); } public Personage AskGoldFish(){ Personage fisher = this; if (fisher.name == "рыбак") { wishes++; switch (wishes) { case 1: ChangeStateOne();break; case 2: ChangeStateTwo();break; case 3: ChangeStateThree();break; default: BackState(ref fisher);break; } return(fisher); } void ChangeStateOne(){ this.status = "муж дворянки"; this.couple.status = "дворянка"; this.couple.wealth = "имение"; } void ChangeStateTwo(){ this.status = "муж боярыни"; this.couple.status = "боярыня"; this.couple.wealth = "много поместий"; }

void ChangeStateThree(){ this.status = "муж государыни"; this.couple.status = "государыня"; this.couple.wealth = "страна"; } void BackState(ref Personage fisher){ BinaryFormatter bf = new BinaryFormatter(); FileStream fs = new FileStream ("State.bin",FileMode.Open, FileAccess.Read); fisher = (Personage)bf.Deserialize(fs); fs.Close(); } public void About(){ Console.WriteLine("имя = {0}, возраст = {1},"+ "статус = {2}, состояние ={3}",name,age,status, wealth); Console.WriteLine("имя = {0}, возраст = {1}," + "статус = {2}, состояние ={3}", this.couple.name, this.couple.age, this.couple.status, this.couple.wealth); }

public static void Main(){ Personage fisher = new Personage("рыбак", 70); Personage wife = new Personage("старуха", 70); fisher.marry(wife); Console.WriteLine("До золотой рыбки"); fisher.About(); fisher = fisher.AskGoldFish(); Console.WriteLine("Первое желание"); fisher.About(); fisher = fisher.AskGoldFish(); Console.WriteLine("Второе желание"); fisher.About(); fisher = fisher.AskGoldFish(); Console.WriteLine("Третье желание"); fisher.About(); fisher = fisher.AskGoldFish(); Console.WriteLine("Еще хочу");fisher.About(); fisher = fisher.AskGoldFish(); Console.WriteLine("Хочу, но уже поздно");fisher.About(); }

Интерфейс ISerializable public void GetObjectData(SerializationInfo info, StreamingContext context) { info.AddValue("name",name); info.AddValue("age", age); info.AddValue("status",status); info.AddValue("wealth", wealth); info.AddValue("couplename",couple.name); info.AddValue("coupleage", couple.age); info.AddValue("couplestatus",couple.status); info.AddValue("couplewealth", couple.wealth); } protected Personage(SerializationInfo info, StreamingContext context) { name = info.GetString("name"); age = info.GetInt32("age"); status = info.GetString("status"); wealth = info.GetString("wealth"); couple = new Personage(info.GetString("couplename"), info.GetInt32("coupleage")); couple.status = info.GetString("couplestatus"); couple.wealth = info.GetString("couplewealth"); this.couple = couple; couple.couple = this; }