В настоящее время существует три способа записи файла:
fs.write(fd, buffer, offset, length, position, callback
)
Вам нужно дождаться обратного вызова, чтобы убедиться, что буфер записан на диск. Это не буферизовано.
fs.writeFile(filename, data, [encoding], callback)
Все данные должны храниться одновременно; Вы не можете выполнять последовательные записи.
fs.createWriteStream(path, [options]
)
Создает WriteStream
, что удобно, поскольку вам не нужно ждать обратного вызова. Но опять же, это не буферизовано.
A WriteStream
, как следует из названия, является потоком. Поток по определению - это «буфер», содержащий данные, которые движутся в одном направлении (источник ► назначение). Но записываемый поток не обязательно «буферизуется». Поток «буферизуется», когда вы пишете n
раз, а во время n+1
поток отправляет буфер в ядро (потому что он заполнен и его необходимо очистить).
Другими словами: «Буфер» - это объект. Является ли он буферизованным или нет, является свойством этого объекта.
Если вы посмотрите на код, WriteStream
наследуется от объекта Stream
, доступного для записи. Если вы обратите внимание, вы увидите, как они очищают контент; у них нет никакой системы буферизации.
Если вы пишете строку, она преобразуется в буфер, а затем отправляется на собственный слой и записывается на диск. При написании строк они не заполняют какой-либо буфер. Итак, если вы делаете:
write("a")
write("b")
write("c")
Вы делаете:
fs.write(new Buffer("a"))
fs.write(new Buffer("b"))
fs.write(new Buffer("c"))
Это три вызова на уровне ввода / вывода. Хотя вы используете «буферы», данные не буферизируются. Буферизованный поток будет выполнять: fs.write(new Buffer ("abc"))
, один вызов уровня ввода / вывода.
На данный момент в Node.js v0.12 (стабильная версия объявлена 06/06/2015) теперь поддерживаются две функции:
cork()
и
uncork()
. Похоже, что эти функции, наконец, позволят вам буферизовать / сбрасывать вызовы записи.
Например, в Java есть некоторые классы, которые предоставляют буферизованные потоки (BufferedOutputStream
, BufferedWriter
...). Если вы записываете три байта, эти байты будут храниться в буфере (памяти) вместо того, чтобы выполнять вызов ввода-вывода только для трех байтов. Когда буфер заполнен, содержимое сбрасывается и сохраняется на диск. Это улучшает производительность.
Я ничего не обнаруживаю, просто вспоминаю, как должен осуществляться доступ к диску.