Как сохранить массив в файл 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(""

<-- Start Test -->
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 - это буферы, которые могут легко изменять размер, и вы можете добавлять и удалять быстрее.

Вы должны перебирать свои данные, используя построитель строк, который намного быстрее обычной строки.затем создайте потоковую запись /чтение (когда вы хотите загрузить файл) из библиотеки ввода-вывода и создайте файл на своем диске.

Читайте также: