Как сохранить массив в файл vb net
Обновлено: 07.07.2024
Как правила, работа с файлами в большинстве своем заключается в чтении и записи файлов. Подобной функицональностью обладает класс FileStream. Он представляет собой поток, связанный с файлом. Рассмотрим его ключевые свойства и методы:
Свойство Length возвращает длину потока в байтах
Свойство Position возвращает текущую позицию в потоке
Метод Read читает данные из файла в массив байтов. Он принимает три параметра: Read(array As Byte(), offset As Integer, count As Integer) As Integer и возвращает количество успешно считанных байтов
Параметр array представляет массив байтов, в который считываются данные из потока
Параметр offset представляет смещение в байтах в массиве array, начиная с которого в массив array будут помещаться считанные байты
Параметр count - максимальное число байтов, предназначенных для чтения. Если в файле находится меньшее количество байтов, то все они будут считаны.
Метод Seek(offset As Long, origin As SeekOrigin) As Long устанавливает позицию в потоке со смещением на количество байт, указанных в параметре offset
Метод Write записывает данные из массива байтов в файл. Принимает три параметра: Write(array As Byte(), offset As Integer, count As Integer)
array представляет массив байтов, откуда будут браться данные для записи в файла
Параметр offset представляет смещение в байтах в массиве array, откуда начинается запись байтов в поток
Параметр count - максимальное число байтов, предназначенных для записи
FileStream предоставляет низкоуровневый доступ к файлам на уровне байтов, поэтому если необходимо выполнить чтение или запись строк в текстовый файл, то массив байтов надо преобразовать в строки с помощью специальных методов. Поэтому для работы с текстовыми файлами лучше использовать другие классы, которые мы далее рассмотрим.
В то же время при работе с различными бинарными файлами, имеющими определенную структуру FileStream может быть очень даже полезен для извлечения определенных порций информации и ее обработки.
Посмотрим на примере считывания-записи в текстовый файл:
Разберем этот пример. И при чтении, и при записи применяется выражение Using. End Using . Данная конструкция позволяет создать объект, который реализует интерфейс IDisposable. И при завершении выполнения кода в этом блоке у данного объекта вызывается метод Dispose , и, таким образом, объект уничтожается. В данном случае в качестве такого объекта служит переменная fstream .
Общий синтаксис конструкции идентичен объявлению переменной, только вместо оператора Dim идет слово Using , а весь блок ззаканчивается выражением End Using
Мы могли бы не использовать конструкцию Using, тогда в этом случае нам нужно бы было явным образом закрыть поток с помощью метода Close:
Объект fstream создается двумя разными способами: через конструктор и через один из статических методов класса File.
Здесь в конструктор передается два параметра: путь к файлу и перечисление FileMode . Данное перечисление указывает на режим доступа к файлу и может принимать следующие значения:
Append : если файл существует, то текст добавляется в конец файл. Если файла нет, то он создается. Файл открывается только для записи.
Create : создается новый файл. Если такой файл уже существует, то он перезаписывается
CreateNew : создается новый файл. Если такой файл уже существует, то он приложение выбрасывает ошибку
Open : открывает файл. Если файл не существует, выбрасывается исключение
Create : создается новый файл. Если такой файл уже существует, то он перезаписывается
OpenOrCreate : если файл существует, он открывается, если нет - создается новый
Truncate : если файл существует, то он перезаписывается. Файл открывается только для записи.
Статический метод OpenRead класса File открывает файл для чтения и возвращает объект FileStream.
Класса FileStream также имеет ряд перегруженных версий конструктора, которые позволяют задать дополнительные параметры потока. Все эти версии можно посмотреть на msdn.
Когда мы работаем с текстовыми файлами, то при записи и при чтении применяется объект кодировки Encoding.Default из пространства имен System.Text . В данном случае мы используем два его метода: GetBytes для получения массива байтов из строки и GetString для преобразования массива байтов в строку.
В итоге введенная нами строка записывается в файл C:\SomeDir\noname\note.txt. Но по сути это не текстовый, а бинарный файл, хотя если мы в него запишем только строку, то сможем в любом текстовом редакторе посмотреть файл в удобочитаемом виде. Но если мы в него запишем случайные байты, то у нас могут возникнуть проблемы с его пониманием. Например:
Поэтому для работы непосредственно с текстовыми файлами предназначены отдельные классы - StreamReader и StreamWriter.
ICQ: 216865379
ICQ: 216865379
P.S.
Кстати нет ли инструментов для работы системами произвольной размерности?
ICQ: 225442067
Кстати нет ли инструментов для работы системами произвольной размерности?Почему все последнее время на .Нет пытаются прибегнуть к помощи каких-либо компонентов, даже не пытаясь сделать хоть что-то самостоятельно?
ICQ: 216865379
только я не вижу в этом выгоды. на мой взгляд сериализация более эффективна.. Особенно если черь идет о BinaryFormatter, у которого на больших объемах данных (>50Мб) скорость сохранения/чтения порядка 80 раз выше нежели аналогов XML,SOAP .. A Base64 есть не что иное как строка + потеря времени на бессмысленную конвертацию.. и следовательно можно предположить, что обрабатываться будет тоже не слишком быстро.. Будет ли сериализация быстрей и для строкового массива и как правильно реализоват?
Я не могу однозначно дать ответ на твой вопрос, поскольку для этого надо знать структуру твоего приложения и порядок работы со строками.. Могу лишь дать несколько рекомендаций..
Как правило, тормоза возникают не на этапе сериализации,а на этапе именно создания и обработки массива. Лично я предпочитаю использовать не массивы в чистом в виде, а разноообразные специализированные коллекции, которые позволяют сделать тоже самое, только на порядок удобнее. В качестве примера, для работы со строками (особенно на больших объемах) во всех книгах рекомендуется использовать:
поскольку это существенно увеличивает быстродействие (проверено лично)
И ты должен понимать,что сериализовать можно, в принципе, любой объект!! (не обязательно массив) Другими словами, перед сериализаций совершенно не обязательно переводить в другую систему счисления или делать какие либо другие действия (согласись, это доп. тормоза), ты можешь сохранить тот же StringBuilder или любую другую коллекцию в первозданном виде и без всяких изменений. Причем так же легко, при необходимости, восстановить этот объект из файла..
Если же у тебя трудности с сериализацией, то примеров масса, главное понять суть этой процедуры, и тогда преимущества станут очевидны..
Dim arrayTest() As Byte
Dim listTest As New List(Of Byte )
Dim stopWatch As New Stopwatch
Dim random As New Random
Console.WriteLine("<-- Start Test -->"
'// Array Test
stopWatch.Start()
For Counter As Integer = 0 To 10000
ReDim Preserve arrayTest(Counter)
arrayTest(Counter) = random. Next (0, 254)
Next
stopWatch. Stop ()
Console.WriteLine("Array Test: ms", stopWatch.Elapsed.TotalMilliseconds)
stopWatch.Reset()
'// List Test
stopWatch.Start()
For Counter As Integer = 0 To 10000
listTest.Add(random. Next (0, 254))
Next
stopWatch. Stop ()
Console.WriteLine("List Test: ms", stopWatch.Elapsed.TotalMilliseconds)
Console.WriteLine(""
Array Test: 90,3852 ms
List Test: 1,1504 ms
по-моему.. разница очевидна.
Это был тест байтового массива.. в случае использования строкового массива результат увеличивается в десятки раз, а это уже достаточно серьезные тормоза!
А вот теперь делай выводы, что лучше использовать - массивы или коллекции?
Сохранение одномерного массива в текстовый файл с добавлением разделителя между его элементами.
Объявляем переменную универсального типа, создаем из нее массив, заполнив ее данными с помощью функции Array:
myArray = Array ( "карась" , "ветка" , 0.5698 , "бегемот" , "рысь" , "2354" )Теперь создаем текстовый файл с помощью метода CreateTextFile. Создаем, а не открываем, для того, чтобы, если такой файл с данными уже существует, от был перезаписан новым пустым файлом.
'связанный с созданным и открытым для записи файломЕсли переменную, предназначенную для создания нового объекта TextStream объявить явно: fl As TextStream , то станут доступны подсказки для автозаполнения свойств и методов этого объекта при написании кода.
Сохраняем информацию из массива в текстовый файл с помощью цикла For… Next:
В качестве разделителя элементов массива используется символ «;». Если точка с запятой встречается в содержимом элементов массива, следует использовать другой разделитель.
Закрываем объект TextStream и открываем созданный текстовый файл для просмотра:
Полный код процедуры VBA Excel для сохранения одномерного массива в текстовый файл:
myArray = Array ( "карась" , "ветка" , 0.5698 , "бегемот" , "рысь" , "2354" )Сохранение двумерного массива
Сохранение двумерного массива в текстовый файл с использованием в качестве разделителей точки с запятой (для элементов в одной строке) и переноса строки.
Раз у нас VBA Excel, то и заполнять двумерный массив будем данными с рабочего листа:
В результате будет создан массив с размерностью (1 to 8, 1 to 4) . Первое измерение массива соответствует строкам диапазона, в второе – столбцам.
Создаем текстовый файл (или перезаписываем существующий) и открываем связанный с ним объект TextStream для записи данных из массива:
'связанный с созданным и открытым для записи файломЗаписываем данные из двумерного массива в текстовый файл:
'Если столбец не последний, добавляем к значению элемента разделитель 'ИначеЕсли столбец последний, а строка не последняя, добавляем к значению знак переноса строки 'знак переноса строки к записываемому тексту добавляет метод WriteLine объекта TextStream ElseIf i2 = UBound ( myArray , 2 ) And i1 <> UBound ( myArray , 1 ) Then 'Иначе (если столбец последний и строка последняя, к значению ничего не добавляем)Закрываем объект TextStream и открываем созданный текстовый файл для просмотра:
Полный код процедуры VBA Excel для сохранения двумерного массива в текстовый файл:
ElseIf i2 = UBound ( myArray , 2 ) And i1 <> UBound ( myArray , 1 ) ThenЗаполнение массива из текстового файла
Заполнение одномерного массива
Обратное заполнение с помощью кода VBA Excel одномерного массива данными из созданного текстового файла "C:\test\testfile1.txt" :
'Считываем весь текст из файла в переменную myString1 'Извлекаем данные из массива для проверки работоспособности кодаЗаполнение двумерного массива
Обратное заполнение с помощью кода VBA Excel двумерного массива из созданного текстового файла "C:\test\testfile2.txt" .
Копируем информацию из текстового файла в переменную myString1:
'Считываем весь текст из файла в переменную myString1Что мы теперь имеем? Все данные из файла "C:\test\testfile2.txt" скопированы в переменную myString1 с исходной структурой: со знаком переноса строки в качестве разделителя строк и точкой с запятой в качестве разделителя столбцов. Этой информацией мы и воспользуемся для заполнения массива myArray() .
У меня есть массив строк, который заполнен тысячами записей.Я хочу самый быстрый способ сохранить эти данные на диск, а также загрузить их обратно.В настоящее время я перебираю массив и добавляю эти данные в строку, а затем сохраняю эту строку.Это занимает много времени.Какой самый быстрый /самый эффективный способ сделать это?Спасибо
4 ответа
Насколько важно, чтобы полученный файл был удобочитаемым?Если он в основном предназначен для последующего чтения программой, вам обязательно следует использовать сериализацию:Редактировать:Чтобы суммировать преимущества этого метода по сравнению с двумя другими, предложенными ниже, первый из них использует StringBuilder для конкатенации большой строки и затем сохраняет ее на диск, а второй использует WriteAllLines для записи массива строк на диск:Первый метод полностью потеряет верность исходному списку строк, поскольку он объединит их в одну строку.Вы можете отделить их позже?Есть ли между ними известные разделители?Не обязательно.Это более эффективно, чем просто вызов + между ними, но это не очень хороший способ их хранения.Второй метод лучше, поскольку каждая строка будет сохранена в отдельной строке и может быть прочитана обратно с помощью ReadAllLines, но здесь вы все еще находитесь в шатком положении.Что происходит, если какая-либо строка содержит символ NewLine?Это будет одна строка при записи, но две разные строки при обратном чтении.Опять же, вызов WriteAllLines /ReadAllLines зависит от того, являются ли новые строки хорошими разделителями, когда это не обязательно так.Использование сериализатора - и не имеет значения, является ли это NetDataContractSerializer, BinaryFormatter или любым другим - сохранит полную точность вашей исходной структуры данных, с небольшими накладными расходами.
Попробуйте использовать StringBuilderСм. Ссылку MSDN для болееПочему струнный строитель?При работе с большими файлами.Желательно использовать класс StringBuilder, а не класс обычной строки.Присоединение строк вместе, требует, чтобы старая строка была скопирована в новую строку.String Builders - это буферы, которые могут легко изменять размер, и вы можете добавлять и удалять быстрее.
Вы должны перебирать свои данные, используя построитель строк, который намного быстрее обычной строки.затем создайте потоковую запись /чтение (когда вы хотите загрузить файл) из библиотеки ввода-вывода и создайте файл на своем диске.
Читайте также: