Автор оригинала: Tendai Mutunhire.
Вступление
Написание файлов – это частое необходимость при программировании на любом языке. Как и другие языки программирования, JavaScript с Node.js имеет дело с использованием файловой системы, интуитивно понятным благодаря использованию модуля, касающейся файловой системы операционной системы.
ФС Модуль содержит функциональные возможности для манипулирования файлами и справиться с файловой системой вычислительной платформы. Наряду с чтением и записью к файлам вы можете использовать модуль для запроса для статистики файлов, таких как размеры файлов и счетчиков.
По умолчанию ФС
Модуль напишет файлы с кодированием «UTF8». UTF-8 Это кодирование, обычно используемое на веб-страницах и других документах. Кодировка файлов относится к набору символов, который используется для содержимого файла. Обычно используемые кодировки являются «UTF8», «ASCII», «двоичный», «шестнадцатеричный», «BASE64» и «UTF16LE».
Каждый кодировщик персонажей имеет определенные преимущества и экземпляры, где он имеет наибольшее значение. Например, «ASCII» – это простая к чётной и записи кодировки, но он будет распределять высокий бит из потока данных. По причинам, подобным этому вы захотите выбрать кодировку вашего персонажа с уходом.
В следующих нескольких разделах мы представим различные способы ФС
Позволяет писать в файловую систему, включая их различия и преимущества.
Метод 1: Использование Fs.WriteFile
ФС
Модуль включает в себя высокий уровень writefile
Способ, который может писать данные для файлов асинхронно. Это означает, что, как и с большим количеством операций в Node.js, ввод/вывод не блокирует и испускает событие при отделке операции. Мы можем написать функцию обратного вызова для запуска, когда writefile
возвращается.
Вот простой код примера записи каких-либо текстов песен в файл:
// writefile.js const fs = require('fs'); let lyrics = 'But still I\'m having memories of high speeds when the cops crashed\n' + 'As I laugh, pushin the gas while my Glocks blast\n' + 'We was young and we was dumb but we had heart'; // write to a new file named 2pac.txt fs.writeFile('2pac.txt', lyrics, (err) => { // throws an error, you could also catch it here if (err) throw err; // success case, the file was saved console.log('Lyric saved!'); });
Мы указали имя файла вместе с символами для записи, а также функцию обратного вызова для выполнения при возврате метода. Мы также можем передавать объект или строку параметров, которые указывают кодировку для использования, а также режим и флаг. Если вам нужно указать кодировку символов, то вот как вам нужно позвонить в метод:
fs.writeFile('2pac.txt', 'Some other lyric', 'ascii', callback);
Обратите внимание, что если файл еще не существует, то вызов этого метода фактически Создать файл Также так вам не нужно беспокоиться об этом на вашем конце.
Есть синхронный метод Fs.writefilesync
что вы можете использовать вместо Fs.writefile
Отказ
Разница в том, что Fs.writefilesync
Способ выполняет операции ввода/вывода синхронно, блокируя цикл события Node.js, пока файл написан. Это может вмешиваться в производительность вашего приложения Node.js, если вы переусердствуете эти синхронные пишеты. В большинстве случаев вы должны предпочесть использовать асинхронные пишеты.
Просто знайте, что вы должны быть осторожны при использовании этих двух методов, потому что они создадут новый файл каждый раз или Они заменит содержимое, если он уже существует. Если вы просто хотите обновить существующий файл, вы захотите использовать ПриложениеFile
, который мы идем позже в этой статье.
Способ 2: Использование Fs.cwrite
В отличие от высокого уровня Fs.writefile
и Fs.writefilesync
Методы, вы можете использовать больше контроля при записи в файлы в Node.js, используя низкоуровневый Fs.write
метод. Fs.write
Способ обеспечивает тонкий контроль над положением в файле, чтобы начать писать, буфер, который вы можете указать для записи, а также какую часть буфера вы хотите записать в файл.
Кроме того, использование низкоуровневой функциональности записи позволяет точно знать, когда файловые дескрипторы выпущены и отвечают соответствующим образом, например, отправив push-уведомления в вашем приложении.
Вот пример, где мы пишем еще несколько строк лирики для другого файла, используя Fs.write
Отказ
// fs_write.js const fs = require('fs'); // specify the path to the file, and create a buffer with characters we want to write let path = 'ghetto_gospel.txt'; let buffer = new Buffer('Those who wish to follow me\nI welcome with my hands\nAnd the red sun sinks at last'); // open the file in writing mode, adding a callback function where we do the actual writing fs.open(path, 'w', function(err, fd) { if (err) { throw 'could not open file: ' + err; } // write the contents of the buffer, from position 0 to the end, to the file descriptor returned in opening our file fs.write(fd, buffer, 0, buffer.length, null, function(err) { if (err) throw 'error writing file: ' + err; fs.close(fd, function() { console.log('wrote the file successfully'); }); }); });
Вы захотите использовать Fs.write
При выполнении мелкозернистых обновлений для файлов, например, запись последовательности байтов в известном положении в середине файла.
Эти методы работают с дескрипторами файлов, и вы должны открыть файл для записи с Fs.Open
А потом, в конце, закройте его снова с Fs.Close
во избежание утечек памяти.
Способ 3: Использование FscreateWreiteStream
При работе особенно больших файлов или файлов, которые входят в куски, скажите из сетевого подключения, используя Потоки Предпочтительно для записи файлов в одном переходе через вышеуказанные методы, которые пишут все файлы.
Потоки пишут небольшое количество данных за раз. Хотя это имеет недостаток медленника, потому что данные передаются в куски, он имеет преимущества для производительности оперативной памяти. Поскольку весь файл не загружен в память все сразу, использование RAM ниже.
Чтобы записать в файл, используя потоки, вам нужно создать новый запорный поток. Затем вы можете записать данные в поток с интервалами, все сразу или в соответствии с доступностью данных с сервера или другого процесса, затем закрыть поток для хорошего, как только все пакеты данных были написаны.
Вот код примера того, как мы делаем это:
// write_stream.js const fs = require('fs'); let writeStream = fs.createWriteStream('secret.txt'); // write some data with a base64 encoding writeStream.write('aef35ghhjdk74hja83ksnfjk888sfsf', 'base64'); // the finish event is emitted when all data has been flushed from the stream writeStream.on('finish', () => { console.log('wrote all data to file'); }); // close the stream writeStream.end();
Мы создали писательский поток, а затем написали некоторые данные в поток. Мы включили оператор журнала, когда выделяется событие «Finish», позволяя нам знать, что все данные были покраснены в базовую систему. В этом случае это означает, что все данные были записаны в файловую систему.
Учитывая преимущества эффективности, потоки – это техника, которую вы увидите широко используемые в территории Node.js, а не только для написания файлов. Другим примером будет использоваться потоки для получения данных из сетевого подключения.
Обработка ошибок при записи в файл
При записи в файлы во время ввода/вывода могут возникнуть множество различных ошибок. Ваш код должен решить эти потенциальные ошибки. Одна простая вещь, которую нужно сделать, это выбросить ошибки в виде исключения Node.js. Это сбивает программу и поэтому не рекомендуется, за исключением случаев, когда у вас мало других ресурсов.
Например, если ошибка может произойти только в качестве ошибки программистов, также известной как ошибку, а затем сбой программы может быть лучшим ответом, поскольку оно легко предупреждает программист ошибки и не скрывает ошибку.
Когда вы имеете дело с эксплуатационными ошибками, такие как указание пути, недоступного, то есть два подхода для получения. Один – вызвать функцию обратного вызова с ошибкой. В обратном вызове вы тогда включите некоторую логику обработки ошибки, например, введя в систему.
Кроме того, вы можете включить блоки TRY/CALL по коду, вызывающему раздел программы, в которой могут возникнуть ошибки.
Присоединяется к файлу с fs.appendFile
В тех случаях, когда мы просто хотим добавить в содержимое файла, мы можем использовать Fs.appendFile
Способ высокого уровня и его синхронный аналог, Fs.appendfilesync
Отказ Используя Fs.appendFile
Создает файл, если он не существует, и включает в себя файл в противном случае.
Вот пример использования Fs.appendFile
написать в файл.
// append_file.js const fs = require('fs'); // add a line to a lyric file, using appendFile fs.appendFile('empirestate.txt', '\nRight there up on Broadway', (err) => { if (err) throw err; console.log('The lyrics were updated!'); });
Здесь мы используем ПриложениеFile
Чтобы добавить дополнительную строку в файл, удерживающий следующую лирику:
// empirestate.txt Empire State of Mind - JAY-Z I used to cop in Harlem; hola, my Dominicanos
Использование Fs.appendFile
Не перезаписает файл, но обновляет его из конечного положения, с новыми данными, которые мы добавляем. Это полезная функция, когда вы просто хотите обновить файл, например, постоянно добавлять данные в один файл журнала.
Поэтому после запуска нашего кода текстовый файл будет выглядеть так:
// empirestate.txt Empire State of Mind - JAY-Z I used to cop in Harlem; hola, my Dominicanos Right there up on Broadway
Как видите, старый текст все еще там, и наша новая строка была добавлена к концу.
Учить больше
Хотите узнать больше о основах Node.js? Лично я бы порекомендовал принять онлайн-курс, как Узнайте Node.js by wes bos Отказ Вы не только узнаете самые современные синтаксис ES2017, но вы получите построить полное приложение для ресторана. По моему опыту создание реальных приложений, как это самый быстрый способ учиться.
Заключение
Как мы видели, есть несколько подходов для рассмотрения при записи в файл в Node.js. Самый простой способ, и часто наиболее подходящим, это использовать writefile
Метод в ФС
модуль. Это позволяет писать на указанный путь к файлу с асинхронным поведением и создает новый файл или заменяет один, если он существует на пути.
Если вы пишете более крупные файлы, вы должны рассмотреть возможности поощрения пишущих писателей. Они позволяют писать буферы данных в кусках, а не загружать данные все сразу в память. Использование потоков помогает вам добиться лучшей производительности в таких случаях.
Для особых ситуаций вы можете использовать более низкий уровень ФС
Утилиты, такие как Fs.write
Отказ ФС
Модуль поддерживает мелкозернистые операции по написанию файлов для соответствия вашим конкретным потребностям.