Solucionado (ver solução)
Solucionado
(ver solução)
5
respostas

PrintWriter tem algum tipo de limite?

Bom dia!

Estava estudando, e decidi pegar um arquivo no site do governo para "tratar" e a partir dele criar um novo, entretanto o arquivo possui 1501 linhas. Quando eu utilizo um while para todar todas as linhas utilizando o "System.out.println(lista.size())" ele demonstra 1501 linhas, entretanto se eu utilizo printWriter.println(string), ele apenas escreve 1300 linhas no arquivo +/-.

Sabem se o PrintWriter tem algum tipo de limite? Não entendo o porquê de não estar escrevendo todas as linhas.

package br.com.falcaoalado.manipulacaocsv;

import java.io.File;
import java.io.PrintWriter;
import java.util.ArrayList;
import java.util.Scanner;

public class TratamentoCsv {

    public static void main(String[] args) throws Exception{

        Scanner scanner = new Scanner(new File("CTB21.csv"));
        PrintWriter pw = new PrintWriter(new File("CTB21_teste.csv"));
        ArrayList<String> lista = new ArrayList<>();

        while(scanner.hasNextLine()) {
            lista.add(scanner.nextLine().replace(",\"", ";\""));
        }

        System.out.println(lista.size());

        for (String string : lista) {
            pw.println(string.replace("\"", ""));
        }
}

Edit1: Acabei de fazer utilizando o método write() do PrintWriter e foi 1501 certinhos, mas não entendo o println não ter feito corretamente ainda

5 respostas

Opa, realmente não tem nenhuma limitação no println... mas também não consegui ver nada de equivocado no seu código :(.

Fala ai Falcão, de boa?

Cara dei uma olhada na documentação e não nada falando sobre limite e tals.

Estou chutando que o formato do arquivo tenha algo no qual ele ignora, tipo uma o linha em branco por exemplo.

solução!

Boa noite!

Fiz a mesma pergunta em um outro local e me retornaram este link: https://ubuntuforums.org/archive/index.php/t-1085686.html

Basicamente, e funcionou, é necessário utilizar o .flush() para limpar o PrintWriter, ficando o código desta forma:

package br.com.falcaoalado.manipulacaocsv;

import java.io.File;
import java.io.PrintWriter;
import java.util.ArrayList;
import java.util.Scanner;

public class TratamentoCsv {

    public static void main(String[] args) throws Exception{

        Scanner scanner = new Scanner(new File("CTB21.csv"));
        PrintWriter pw = new PrintWriter(new File("CTB21_teste.csv"));
        ArrayList<String> lista = new ArrayList<>();

        while(scanner.hasNextLine()) {
            lista.add(scanner.nextLine().replace(",\"", ";\""));
        }

        System.out.println(lista.size());

        for (String string : lista) {
            pw.println(string.replace("\"", ""));
            pw.flush();
        }
}

O código acima passou a funcionar sem problemas, entretanto me gerou duas dúvidas:

O .flush() faz o que exatamente? Ele limpa a memória requisitada para tal operação?

E outra coisa: utilizar o .flush() em um laço de repetição é utilizar muita memória desnecessáriamente?

Vc precisa dar flush PQ esqueceu um ponto muito importante ao trabalhar com io: Vc precisa garantir que o scanner e o writer fechem o recurso alocado. O método close no objeto printwriter garante o flush do q restou na memória e fecha o recurso.

Se estiver usando o Java 7+, usa o try with resources.

Opa, Gustavo, bom dia!

Na realidade eu utilizei, utilizava após o laço de repetição, esqueci de colocar no código.

Será que eu deveria usar durante o laço? Mas aí acredito que estaria utilizando errado o .close()

Quer mergulhar em tecnologia e aprendizagem?

Receba a newsletter que o nosso CEO escreve pessoalmente, com insights do mercado de trabalho, ciência e desenvolvimento de software