[RESOLVIDO] Trabalhando arquivos TXT

Olá,
Por favor, se alguém conseguir me ajudar… tenho uma pasta com ‘N’ arquivos .txt e preciso converter o conteúdo de todos eles para maiúsculo, mas ele grava o arquivo vazio, teria como alguém me ajudar? não estou conseguindo encontrar o erro.

String diretorio = “C:\Users\Administrador\Downloads\HC”;

    File file = new File(diretorio);
    File afile[] = file.listFiles();
    int i = 0;
    for (int j = afile.length; i < j; i++) {
        BufferedReader in = null;
        try {
            BufferedReader buffer = null;
            File arquivos = afile[i];

            in = new BufferedReader(new InputStreamReader(new FileInputStream(afile[i]), "UTF8"));
            String str;

            FileWriter arq = new FileWriter(afile[i]);
            PrintWriter gravarArq = new PrintWriter(arq);
            
            while ((str = in.readLine()) != null) {
                gravarArq.printf(str.toLowerCase());
            }
            arq.close();
            in.close();

vc nao pode escrever E ler no mesmo arquivo.

vc tem duas opções:

  1. vc le do arquivo origem, escreve em um arquivo temporario e depois renomeia/move esse arquivo temporario para o arquivo de origem

  2. vc le o conteudo do arquivo de origem em memoria, faz a transformação que vc quer em memoria e depois vc escreve no arquivo de origem.

as duas opções tem vantagens e desvantagens. se os arquivos forem grandes vc vai usar muita memoria. criar arquivos temporarios não é uma atividade trivial

boa sorte

mas é essa 2ª opção que eu estou fazendo amigo, a questão é que está com algum erro no meu código que esta escrevendo tudo em branco e eu não estou encontrando, quando eu vejo o valor da variável ela está com texto.

cara vc não esta fazendo isso.

vc esta lendo de um BufferedReader e esta escrevendo no PrintWriter LINHA POR LINHA

inclusive vc vai ter uma surpresa: vc vai perder os caracteres newline desse jeito.

se vc realmente quer escrever em memoria, escreva em um stringbuffer primeiro, depois escreva de volta no arquivo.

1 curtida
import java.io.File;
import java.io.FileFilter;
import java.io.IOException;
import java.io.PrintWriter;
import java.nio.file.Files;
import java.util.List;

public class Exemplo {

    public static void main(String[] args) {
        File diretorio = new File("C:\\Users\\Administrador\\Downloads\\HC");
        Exemplo programa = new Exemplo();
        programa.verificarDiretorio(diretorio);
    }

    private final FileFilter pastasEarquivosTxt = new FileFilter() {

        @Override
        public boolean accept(File file) {
            if (file.isDirectory()) {
                return true;
            }
            return file.getName().toLowerCase().endsWith(".txt");
        }
    };

    private void verificarDiretorio(File diretorio) {
        for (File file : diretorio.listFiles(pastasEarquivosTxt)) {
            if (file.isDirectory()) {
                verificarDiretorio(file);
            } else {
                converterArquivoPraMaiusculo(file);
            }
        }
    }

    private void converterArquivoPraMaiusculo(File arquivo) {
        try {
            List<String> linhas = Files.readAllLines(arquivo.toPath());
            PrintWriter saida = new PrintWriter(arquivo);
            for (String linha : linhas) {
                saida.println(linha.toUpperCase());
            }
            saida.flush();
            saida.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}
1 curtida

Funcionou perfeitamente, muito obrigado, você tem algum lugar onde pesquisou e estudou para montar este exemplo? queria aprender como fazer xD

Vc pode consultar a documentação das classes para entender como elas funcionam.

Para entender como desenhar uma aplicação pensando em memória, i/o, cpu existem varias disciplinas separadas que vc precisa estudar, como estruturas de dados, algoritmos, sistemas operacionais, etc.

Mesmo q java rode sob uma máquina virtual o conceito de arquivo é algo q vem de sistemas operacionais.

Pratique bastante

1 curtida