Escribir en archivos en Node.js

    Introducci贸n

    Escribir en archivos es una necesidad frecuente al programar en cualquier lenguaje. Al igual que otros lenguajes de programaci贸n, JavaScript con Node.js hace que el manejo del sistema de archivos sea intuitivo mediante el uso de un m贸dulo que se ocupa del sistema de archivos del sistema operativo.

    los fs El m贸dulo contiene la funcionalidad para manipular archivos y tratar con el sistema de archivos de la plataforma inform谩tica. Adem谩s de leer y escribir en archivos, puede utilizar el m贸dulo para consultar estad铆sticas de archivos, como tama帽os y recuentos de archivos.

    Por defecto, el fs El m贸dulo escribir谩 archivos con una codificaci贸n de ‘utf8’. UTF-8 es una codificaci贸n com煤nmente utilizada en p谩ginas web y otros documentos. La codificaci贸n de archivos se refiere al conjunto de caracteres que se utiliza para el contenido del archivo. Las codificaciones m谩s utilizadas son ‘utf8’, ‘ascii’, ‘binary’, ‘hex’, ‘base64’ y ‘utf16le’.

    Cada codificaci贸n de caracteres tiene ventajas espec铆ficas y casos en los que tiene m谩s sentido. Por ejemplo, ‘ascii’ es una codificaci贸n f谩cil de leer y escribir, pero eliminar谩 el bit alto del flujo de datos. Por razones como esta, querr谩 seleccionar la codificaci贸n de caracteres con cuidado.

    En las pr贸ximas secciones presentaremos las diferentes formas fs le permite escribir en el sistema de archivos, incluidas sus diferencias y ventajas.

    M茅todo 1: usar fs.writeFile

    los fs m贸dulo incluye un alto nivel writeFile m茅todo que puede escribir datos en archivos de forma asincr贸nica. Esto significa que, al igual que con muchas operaciones en Node.js, la E / S no se bloquea y emite un evento cuando finaliza la operaci贸n. Podemos escribir una funci贸n de devoluci贸n de llamada para que se ejecute cuando el writeFile devoluciones.

    Aqu铆 hay un ejemplo de c贸digo simple de c贸mo escribir algunas letras de canciones en un archivo:

    // writefile.js
    
    const fs = require('fs');
    
    let lyrics="But still I"m having memories of high speeds when the cops crashedn' + 
                 'As I laugh, pushin the gas while my Glocks blastn' + 
                 '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!');
    });
    

    Especificamos el nombre del archivo, junto con los caracteres a escribir, as铆 como una funci贸n de devoluci贸n de llamada para ejecutar cuando el m茅todo regrese. Tambi茅n podemos pasar un objeto o cadena de opciones que especifique la codificaci贸n a usar, as铆 como el modo y la bandera. Si necesita especificar la codificaci贸n de caracteres, esta es la forma en que deber谩 llamar al m茅todo:

    fs.writeFile('2pac.txt', 'Some other lyric', 'ascii', callback);
    

    Tenga en cuenta que si el archivo a煤n no existe, llamar a este m茅todo tambi茅n crear谩 el archivo, por lo que no tiene que preocuparse por eso.

    Hay un m茅todo sincr贸nico fs.writeFileSync que puedes usar en lugar de fs.writeFile.

    La diferencia es que el fs.writeFileSync El m茅todo realiza operaciones de entrada / salida de forma sincr贸nica, bloqueando el bucle de eventos de Node.js mientras se escribe el archivo. Esto puede interferir con el rendimiento de su aplicaci贸n Node.js si se excede en estas escrituras sincr贸nicas. En la mayor铆a de los casos, deber铆a preferir utilizar las escrituras asincr贸nicas.

    Solo sepa que debe tener cuidado al usar estos dos m茅todos porque crear谩n un nuevo archivo cada vez o reemplazar谩n el contenido si ya existe. Si simplemente desea actualizar un archivo existente, querr谩 usar appendFile, que repasaremos m谩s adelante en este art铆culo.

    M茅todo 2: usar fs.write

    A diferencia del alto nivel fs.writeFile y fs.writeFileSync m茅todos, puede aprovechar m谩s control al escribir en archivos en Node.js utilizando el nivel bajo fs.write m茅todo. los fs.write El m茅todo permite un control preciso sobre la posici贸n en el archivo en el que comenzar a escribir, un b煤fer que puede especificar para escribir, as铆 como la parte del b煤fer que desea escribir en el archivo.

    Adem谩s, el uso de la funcionalidad de escritura de bajo nivel le permite saber con precisi贸n cu谩ndo se publican los descriptores de archivos y responder en consecuencia, como enviando notificaciones autom谩ticas en su aplicaci贸n.

    Aqu铆 hay un ejemplo en el que escribimos otras pocas l铆neas de letra en un archivo diferente usando 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 menI welcome with my handsnAnd 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');
            });
        });
    });
    

    Querr谩s usar fs.write al realizar actualizaciones detalladas de archivos, por ejemplo, al escribir una secuencia de bytes en una posici贸n conocida en el medio de un archivo.

    Estos m茅todos funcionan con descriptores de archivo y debe abrir el archivo para escribir con fs.open y luego, al final, volver a cerrarlo con fs.close para evitar p茅rdidas de memoria.

    M茅todo 3: usar fs.createWriteStream

    Al manejar archivos particularmente grandes, o archivos que vienen en trozos, digamos desde una conexi贸n de red, usando corrientes es preferible escribir archivos de una sola vez mediante los m茅todos anteriores que escriben archivos completos.

    Los flujos escriben peque帽as cantidades de datos a la vez. Si bien esto tiene la desventaja de ser m谩s lento porque los datos se transfieren en fragmentos, tiene ventajas para el rendimiento de la RAM. Dado que el archivo completo no se carga en la memoria de una vez, el uso de RAM es menor.

    Para escribir en un archivo mediante secuencias, debe crear una nueva secuencia de escritura. Luego, puede escribir datos en el flujo a intervalos, todos a la vez, o seg煤n la disponibilidad de datos de un servidor u otro proceso, luego cerrar el flujo definitivamente una vez que se hayan escrito todos los paquetes de datos.

    Aqu铆 hay un ejemplo de c贸digo de c贸mo hacemos esto:

    // 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();
    

    Creamos un flujo de escritura y luego escribimos algunos datos en el flujo. Hemos incluido una declaraci贸n de registro cuando se emite el evento “fin”, que nos informa que todos los datos se han descargado al sistema subyacente. En este caso, eso significa que todos los datos se han escrito en el sistema de archivos.

    Dadas las ventajas de rendimiento, las transmisiones son una t茅cnica que ver谩 que se usa ampliamente en el territorio de Node.js, no solo para la escritura de archivos. Otro ejemplo ser铆a el uso de transmisiones para recibir datos de una conexi贸n de red.

    Manejo de errores al escribir en un archivo

    Al escribir en archivos, pueden ocurrir muchos errores diferentes durante la entrada / salida. Su c贸digo debe abordar estos posibles errores. Una cosa simple que puede hacer es lanzar los errores como excepciones de Node.js. Esto bloquea el programa y, por lo tanto, no se recomienda, excepto en los casos en los que tenga pocos otros recursos.

    Por ejemplo, si el error solo puede ocurrir como un error del programador, tambi茅n conocido como error, bloquear el programa puede ser la mejor respuesta, ya que alerta al programador del error de inmediato y no lo oculta.

    Cuando se trata de errores operativos, como especificar una ruta que es inaccesible, hay dos enfoques a seguir. Uno es llamar a una funci贸n de devoluci贸n de llamada con el error. En la devoluci贸n de llamada, luego incluye alguna l贸gica para manejar el error, como registrarlo.

    Alternativamente, puede incluir bloques try / catch alrededor del c贸digo llamando a la secci贸n del programa donde pueden ocurrir errores.

    Agregar a un archivo con fs.appendFile

    En los casos en los que solo queremos agregar al contenido de un archivo, podemos usar el fs.appendFile m茅todo de alto nivel y su contraparte s铆ncrona, fs.appendFileSync. Utilizando la fs.appendFile crea el archivo si no existe y, en caso contrario, lo agrega al archivo.

    Aqu铆 hay un ejemplo de uso fs.appendFile escribir en un archivo.

    // 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!');
    });
    

    Aqu铆, estamos usando appendFile para agregar una l铆nea adicional a un archivo que contiene la siguiente letra:

    // empirestate.txt
    
    Empire State of Mind - JAY-Z
    
    I used to cop in Harlem;
    hola, my Dominicanos
    

    Utilizando fs.appendFile no sobrescribe el archivo, sino que lo actualiza desde la posici贸n final, con los nuevos datos que agregamos. Esta es una caracter铆stica 煤til cuando solo desea actualizar un archivo, como agregar continuamente datos a un solo archivo de registro.

    Entonces, despu茅s de ejecutar nuestro c贸digo, el archivo de texto se ver谩 as铆:

    // empirestate.txt
    
    Empire State of Mind - JAY-Z
    
    I used to cop in Harlem;
    hola, my Dominicanos
    Right there up on Broadway
    

    Como puede ver, el texto antiguo todav铆a est谩 all铆 y nuestra nueva cadena se ha agregado al final.

    Aprende m谩s

    驴Quiere obtener m谩s informaci贸n sobre los fundamentos de Node.js? Personalmente, recomendar铆a tomar un curso en l铆nea como Aprenda Node.js de Wes Bos. No solo aprender谩 la sintaxis de ES2017 m谩s actualizada, sino que tambi茅n podr谩 crear una aplicaci贸n de restaurante completa. En mi experiencia, crear aplicaciones del mundo real como esta es la forma m谩s r谩pida de aprender.

    Conclusi贸n

    Como vimos, hay varios enfoques a considerar al escribir en un archivo en Node.js. La forma m谩s sencilla, y a menudo la m谩s adecuada, es utilizar el writeFile m茅todo en el fs m贸dulo. Esto le permite escribir en una ruta de archivo especificada, con un comportamiento asincr贸nico, y crea un nuevo archivo o reemplaza uno si existe en la ruta.

    Si est谩 escribiendo archivos m谩s grandes, debe considerar las capacidades de escritura fragmentada de las secuencias de escritura. Estos permiten escribir b煤feres de datos en fragmentos, en lugar de cargar todos los datos a la vez en la memoria. El uso de transmisiones lo ayuda a lograr un mejor rendimiento en tales casos.

    Para situaciones especiales, puede utilizar el nivel inferior fs utilidades como fs.write. los fs El m贸dulo admite operaciones de escritura de archivos detalladas para satisfacer sus necesidades espec铆ficas.

     

    Etiquetas:

    Deja una respuesta

    Tu direcci贸n de correo electr贸nico no ser谩 publicada. Los campos obligatorios est谩n marcados con *