Рубрики
Без рубрики

Написание файлов в Node.js

Автор оригинала: 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 Отказ ФС Модуль поддерживает мелкозернистые операции по написанию файлов для соответствия вашим конкретным потребностям.