Salvar arquivo txt

2 respostas
S

Ola pessoal. Estou com um pequeno problema que não consigo entender. O algoritmo é um ordenador de números inteiros chamado Bubblesort. O problema surge na hora de salvar um novo arquivo com todos os números ordenados que estão dentro de um vetor, por alguma razão ao invés de gravar 10 mil números, ele grava apenas 5806. Tentei com arquivos com 50 mil e 100 mil e parece sempre faltar parte dos números no novo arquivo gerado.

obs: O arquivo de leitura está em anexo.

import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.io.PrintWriter;
import java.util.StringTokenizer;
import javax.swing.JFileChooser;

public class BubbleSort {

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

        JFileChooser chooser = new JFileChooser();
        int returnVal = chooser.showOpenDialog(null);

        String n = "";
        String VetorDeString = "";

        if (returnVal == JFileChooser.APPROVE_OPTION) {
            File f = chooser.getSelectedFile();

            BufferedReader reader = new BufferedReader(new FileReader(f));

            while ((n = reader.readLine()) != null) {
                VetorDeString += n;
            }

            StringTokenizer st = new StringTokenizer(VetorDeString);
            int i = 0;
            int Total = st.countTokens();
            String[] vetor2 = new String[Total];

            while (st.hasMoreTokens()) {
                vetor2[i] = st.nextToken();
                i++;
            }

            int[] vetor = new int[Total];

            for (int k = 0; k < Total; k++) {
                vetor[k] = Integer.parseInt(vetor2[k]);
            }

            int aux, for1, for2;

            System.out.println("*******Ordenando*******\n");
            for (for1 = 0; for1 < i; for1++) {
                for (for2 = 0; for2 < i - 1; for2++) {
                    if (vetor[for2] > vetor[for2 + 1]) {
                        aux = vetor[for2];
                        vetor[for2] = vetor[for2 + 1];
                        vetor[for2 + 1] = aux;
                    }
                }
            }

            File arquivo = new File("C:\\DezMil.txt");
            PrintWriter printWriter = new PrintWriter(arquivo);

            int k, auxiliar = 0;
            for (k = 0; k < Total; k++) {
                //auxiliar = vetor[k];
                //printWriter.write(auxiliar + " ");
                printWriter.print(vetor[k] + " ");
            }
        }
    }
}

Agradeço a paciência.

2 Respostas

G
printWriter.close();

ou

printWriter.flush();

logo abaixo do for.

lembre de fechar o recurso quando terminar

ViniGodoy

Dá para modernizar esse código também. Não se usa mais StringTokenizer desde o Java 5. Já criaram formas melhores de ler arquivos no Java 5 (Scanner) e depois novamente no Java 7 (Files).

Finalmente, não crie uma variável chamada "i" (que tipicamente só tem o escopo de um loop) com um escopo tão grande. É pedir para o código ficar confuso.

Um código mais moderno seria:

import javax.swing.*;
import java.io.File;
import java.io.PrintWriter;
import java.nio.file.Files;

public class BubbleSort {

    public static void main(String[] args) throws Exception {
        //Pede para o usuário escolher o arquivo
        JFileChooser chooser = new JFileChooser();
        int returnVal = chooser.showOpenDialog(null);
        if (returnVal != JFileChooser.APPROVE_OPTION) {
            return;
        }

        //Le o arquivo do disco
        String texto = new String(Files.readAllBytes(chooser.getSelectedFile().toPath()));
        //Separa o arquivo pelo caracter de espaço
        String[] vetor2 = texto.split(&quot; &quot;);
        //Converte o array para inteiros.
        int[] vetor = new int[vetor2.length];
        for (int k = 0; k &lt; vetor.length; k++) {
            vetor[k] = Integer.parseInt(vetor2[k]);
        }

        //Ordenação com bubble sort
        System.out.println(&quot;******* Ordenando *******\n&quot;);
        for (int i = 0; i &lt; vetor.length; i++) {
            for (int j = 0; j &lt; vetor.length - i - 1; j++) {
                if (vetor[j] &gt; vetor[j+1]) {
                    int aux = vetor[j];
                    vetor[j] = vetor[j+1];
                    vetor[j+1] = aux;
                }
            }
        }

        //Grava o arquivo no disco
        File arquivo = new File(chooser.getSelectedFile().getParentFile(), &quot;saida.txt&quot;);
        try (PrintWriter printWriter = new PrintWriter(arquivo)) {
            for (int valor : vetor) {
                printWriter.printf(&quot;%d &quot;, valor);
            }
        }
    }
}
Criado 26 de agosto de 2014
Ultima resposta 26 de ago. de 2014
Respostas 2
Participantes 3