Автор оригинала: Scott Robinson.
Одним из самых распространенных вещей, которые вы захотите сделать с любым языком программирования, открыт и прочитал файл. С большими языками это довольно просто, но для ветеранов JavaScript это может показаться немного странным. В течение многих лет JavaScript был доступен только в браузере, поэтому разработчики интерфейса могут быть знакомы только с FialeReader API или похожие.
Node.js, как вы, наверное, знаете, сильно отличается от вашего типичного JavaScript в браузере. Он имеет свой собственный набор библиотек, предназначенных для обработки задач ОС и файловых систем, таких как открытие и чтение файлов. В этой статье я покажу вам, как использовать Node.js для чтения файлов. В частности, мы будем использовать ФС Модуль, чтобы сделать только это.
Есть два способа открыть и прочитать файл, используя ФС
модуль:
- Загрузите все содержимое сразу (буферизация)
- Постепенно нагрузка содержимое (потоковое)
Каждый из этих методов будет объяснен в следующих двух разделах.
Содержание буферизации с fs.readfile
Это самый распространенный способ прочитать файл с Node.js, особенно для начинающих, благодаря своей простоте и удобству. Хотя, как вы приедете, чтобы реализовать в следующем разделе, это не обязательно является лучшим или наиболее эффективным.
Вот быстрый пример, используя Fs.readfile :
var fs = require('fs'); fs.readFile('my-file.txt', 'utf8', function(err, data) { if (err) throw err; console.log(data); });
данные
Аргумент обратного вызова содержит полное содержимое файла, представленного как строку в UTF8
формат. Если вы опускаете UTF8
Аргумент полностью, то метод просто вернет необработанное содержимое в Буфер объект. Удаление UTF8
Аргумент в вышеуказанном коде (и предполагающий my-file.txt содержал строку “Привет!”), мы получили этот вывод:
$ node read-file.js
Возможно, вы заметили, что Fs.readfile
Возвращает содержимое в обратном вызове, что означает, что этот метод проходит асинхронно. Это следует использовать, когда это возможно, чтобы избежать блокировки основного выполнения нити, но иногда вы должны делать вещи синхронно, в этом случае узел Case предоставляет вам Readfilesync метод.
Этот метод работает точно так же, за исключением того, что содержимое файла возвращается непосредственно из вызова функции, и нить выполнения заблокирована, пока он загружает файл. Обычно я использую это в стартовых разделах моих программ (например, когда мы загружаем файлы конфигурации) или в командных строках, где блокируя основной нить, не является большой сделкой.
Вот как загрузить файл синхронно с узлом:
var fs = require('fs'); try { var data = fs.readFileSync('my-file.txt', 'utf8'); console.log(data); } catch(e) { console.log('Error:', e.stack); }
Обратите внимание, что с блокировкой (синхронному) вызовом, мы должны использовать попробуй ... поймать
Чтобы обработать любые ошибки, в отличие от неблокирующейся (асинхронной) версии, в которой были прошедшие ошибки в качестве аргументов.
Кроме того, как эти методы возвращают данные и обрабатывают ошибки, они работают очень одинаково.
Потоковое содержимое с fsceletseadstream
Второй способ открыть и прочитать файл – открыть его как Поток используя FskcreateSeadstream метод. Все потоки узлов – это экземпляры Eventemitter Объект, позволяющий вам подписаться на важные события.
Читаемый объект потока может быть полезен для многих причин, некоторые из которых включают в себя:
- Меньшая память следа Отказ Поскольку данные целевого файла загружаются в кусочки, не так много памяти, необходима для хранения данных в буфере.
- Быстрое время отклика Отказ Для чувствительных к времени приложения время между запросом и ответом имеет решающее значение. Потоки сокращают время отклика (особенно для больших файлов), поскольку им не нужно ждать, чтобы загрузить весь файл перед возвратом данных.
- Данные трубопроводы Отказ Обозначение потока позволяет использовать общий интерфейс между производителями и потребителями данных, чтобы пройти эти данные по каналам. Это очень похоже на Unix трубы концепция.
Хотя это действительно не очень трудно использовать потоки, они могут быть немного запутаны и не так интуитивно понятны, как Fs.readfile
метод. Вот «Hello World» потоковой передачи файлов:
var fs = require('fs'); var data = ''; var readStream = fs.createReadStream('my-file.txt', 'utf8'); readStream.on('data', function(chunk) { data += chunk; }).on('end', function() { console.log(data); });
Этот код делает именно то, что делает код в первом разделе, за исключением того, что мы должны «собирать» куски данных, прежде чем печатать его на консоль. Если ваш файл довольно маленький, то вы, вероятно, когда-либо получаете только один кусок, но для больших файлов, таких как аудио и видео, вам придется собирать несколько кусков. Это тот случай, когда вы начнете замечать реальное значение потоковых файлов.
Обратите внимание, что пример, который я показал выше, в основном поражает цель использования потока, так как мы в конечном итоге собираем данные в буфере (переменной), но, по крайней мере, это дает вам представление о том, как они работают. Лучший пример, показывающий сильные стороны потоков файлов, можно увидеть здесь, в экспресс-маршруте, который обрабатывает запрос на файл:
var fs = require('fs'); var path = require('path'); var http = require('http'); var staticBasePath = './static'; var staticServe = function(req, res) { var fileLoc = path.resolve(staticBasePath); fileLoc = path.join(fileLoc, req.url); var stream = fs.createReadStream(fileLoc); stream.on('error', function(error) { res.writeHead(404, 'Not Found'); res.end(); }); stream.pipe(res); }; var httpServer = http.createServer(staticServe); httpServer.listen(8080);
Все, что мы здесь делаем, открыт файл FskcreateSeadstream
и трубайте его до объекта ответа, res
Отказ Мы можем даже подписаться на Ошибка
. События и справиться с теми, как они случаются. Это гораздо лучший способ обработки файлов, как только вы узнаете, как правильно использовать его. Для более полного примера и объяснения вышеуказанного кода проверьте эту статью на Создание статических файловых серверов с узлом Отказ
Заключение
Из этой статьи вы должны были узнать основы для чтения файлов, а также некоторых современных методов загрузки, используя объекты потока. Знание, когда их использовать, является ключом и следует тщательно рассмотрено для ограниченных памяти или с ограниченным временем приложений.
Какой у вас предпочитаемый метод обработки файлов? Как вы использовали ручьи в прошлом? Дайте нам знать об этом в комментариях!