Como ler e escrever arquivos no Node

Manipular arquivos é uma tarefa comum em muitas aplicações, e o Node.js fornece uma poderosa API para essa tarefa por meio do módulo fs (file system). Neste post, vamos explorar como ler e escrever arquivos no Node.js.

Introdução ao módulo fs

O módulo fs faz parte do core do Node.js, ou seja, ele já vem instalado e não precisa de pacotes adicionais. Ele oferece métodos para operações de leitura e escrita, tanto de maneira síncrona quanto assíncrona. Vamos entender essas abordagens e quando cada uma delas é mais adequada.

1. Lendo arquivos

a. Leitura assíncrona

A leitura assíncrona é preferível para operações de I/O porque permite que outras tarefas sejam executadas enquanto o arquivo está sendo lido. Use o método fs.readFile para isso.

const fs = require('fs');

fs.readFile('exemplo.txt', 'utf8', (err, data) => {
    if (err) {
        console.error('Erro ao ler o arquivo:', err);
        return;
    }
    console.log('Conteúdo do arquivo:', data);
});

Neste exemplo:

  • utf8 é passado para garantir que o conteúdo do arquivo seja lido como texto. Se omitido, os dados serão retornados como um buffer;

  • A função de callback ((err, data) => { ... }) lida com o erro e exibe o conteúdo.

b. Leitura síncrona

A leitura síncrona é feita com fs.readFileSync. Essa abordagem bloqueia o fluxo do código até que o arquivo seja lido, sendo útil para scripts pequenos ou quando você precisa da informação imediatamente.

const fs = require('fs');

try {
    const data = fs.readFileSync('exemplo.txt', 'utf8');
    console.log('Conteúdo do arquivo:', data);
} catch (err) {
    console.error('Erro ao ler o arquivo:', err);
}

2. Escrevendo arquivos

a. Escrita assíncrona

Para escrever em um arquivo de maneira assíncrona, use fs.writeFile. Se o arquivo já existir, ele será substituído, então tome cuidado para não sobrescrever dados importantes.

const fs = require('fs');

const conteudo = 'Este é um exemplo de escrita em arquivo.';

fs.writeFile('novoArquivo.txt', conteudo, 'utf8', (err) => {
    if (err) {
        console.error('Erro ao escrever no arquivo:', err);
        return;
    }
    console.log('Arquivo escrito com sucesso!');
});

b. Escrita síncrona

Para escrita síncrona, utilize fs.writeFileSync. Isso garante que o arquivo será completamente escrito antes de o código prosseguir.

const fs = require('fs');

const conteudo = 'Escrevendo de maneira síncrona.';

try {
    fs.writeFileSync('novoArquivoSync.txt', conteudo, 'utf8');
    console.log('Arquivo escrito com sucesso!');
} catch (err) {
    console.error('Erro ao escrever no arquivo:', err);
}

3. Acrescentando conteúdo ao arquivo

Para adicionar conteúdo sem substituir o conteúdo existente, use fs.appendFile para uma abordagem assíncrona ou fs.appendFileSync para uma abordagem síncrona.

Exemplo com appendFile

const fs = require('fs');

const novoConteudo = '\nConteúdo adicional.';

fs.appendFile('novoArquivo.txt', novoConteudo, 'utf8', (err) => {
    if (err) {
        console.error('Erro ao adicionar conteúdo:', err);
        return;
    }
    console.log('Conteúdo adicionado com sucesso!');
});

4. Exemplo completo: lendo e escrevendo

Veja um exemplo prático de leitura, modificação e regravação de um arquivo:

const fs = require('fs');

fs.readFile('exemplo.txt', 'utf8', (err, data) => {
    if (err) {
        console.error('Erro ao ler o arquivo:', err);
        return;
    }

    const novoConteudo = data + '\nTexto adicional!';
    
    fs.writeFile('exemplo.txt', novoConteudo, 'utf8', (err) => {
        if (err) {
            console.error('Erro ao escrever no arquivo:', err);
            return;
        }
        console.log('Arquivo atualizado com sucesso!');
    });
});

Outro exemplo prático

Os módulos têm as formas síncronas (lê o arquivo completamente para depois liberar o event loop – bom para arquivos pequenos) e assíncronas (ideal para arquivos muito grandes para não travar o processamento).

Veja abaixo exemplos de criação e leitura de arquivos:

Arquivo “arquivo.json”:

 //exemplo de arquivo de configuração de banco de dados:
 {
    "db": {
         "host": "localhost",
         "port": 3306,
         "user": "admin",
         "pass": "123abc"
    }
 } 

Arquivo “leitura.json”:

 const fs = require('fs') //Faz um require em cima do módulo 'fs' (file system)
 const caminho = __dirname + '\arquivo.json'
 
 //Síncrono
 const conteudo = fs.readFileSync(caminho, 'utf-8')
 console.log(conteudo)
 
 //Será mostrado:
  {
    "db": {
         "host": "localhost",
         "port": 3306,
         "user": "admin",
         "pass": "123abc"
    }
 } 

//Assíncrono

 /* É passada uma função callback após a leitura do arquivo para posterior tratamento.
 O primeiro argumento é err (erro) e conteudo. Caso nenhum erro seja gerado, o conteúdo é lido: */

 fs.readFile(caminho, 'utf-8', (err, conteudo) => {
   const config = JSON.parse(conteudo)
   
   //Utilizamos um template string para mostrar os conteúdos de host e port do arquivo "arquivo.json":
   console.log(`${config.db.host}:${config.db.port}`)
 })

 //Também é possível simplificar os códigos acima desta forma:
 const config = require('./arquivo.json')
 console.log(config.db)

 //Leitura de diretório:
 fs.readdir(__dirname, (err, arquivos) => {
   console.log('Conteúdo da pasta: ')
   console.log(arquivos)
 })

Para escrever arquivos:

  const fs = require
  
 //Objeto que será persistido (gravado) no disco:
  const produto = {
     nome: 'Computador',
     valor: 2950.50,
     desc: 0.9
  }
  
 //É preciso transformar o objeto em texto para transformá-lo depois no formato JSON: 
  fs.writeFile(__dirname + '/arquivoGerado.json', JSON.stringify(produto), err => {
   //Utilizamos uma função callback (err) para verificar possíveis erros
   
   //Se "err" for nulo (falso) então 'Arquivo salvo!' é mostrado (true):
   console.log(err || 'Arquivo salvo!') 
  }) 

A manipulação de arquivos no Node.js é simples e versátil. Utilizar a versão síncrona ou assíncrona depende da necessidade de sua aplicação. No geral, a abordagem assíncrona é mais recomendada para manter a fluidez da aplicação.

QUER SER UM PROGRAMADOR FULL-STACK E DOMINAR AS PRINCIPAIS TECNOLOGIAS DO MERCADO?

Aprenda através de projetos reais e aulas práticas. São 20 cursos completos + cursos bônus. Grupos privados exclusivos, atualizações constantes e lives semanais.

Python, PHP, Java Script, CSS, Node, Angular JS, MySQL, Photoshop, Flutter, AWS, Apache e muito mais!

CLIQUE NA IMAGEM ABAIXO E CONFIRA MAIS DETALHES:

CLIQUE AQUI E SAIBA MAIS

Dúvidas ou sugestões sobre como ler e escrever arquivos no Node? Deixem nos comentários! Para mais dicas, acesse o nosso canal no YouTube:
https://youtube.com/criandobits

Tags:

Sobre o Autor

Benedito Silva Júnior
Benedito Silva Júnior

Bacharel em Sistemas de Informação pelo Instituto Paulista de Pesquisa e Ensino IPEP. Apaixonado por tecnologias e games do tempo da vovó!

0 Comentários

Deixe um comentário

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *