1
resposta

Escrita no Arquivo baseado em Dados Digitados pelo Usuário pelo console

Pessoal, bom dia, estou fazendo testes para solidificar o aprendizado referente a arquivos e tal. Eu estou fazendo um teste, e uma das opções do teste é o usuário escolher um arquivo, e apenas o sistema verificar se esse arquivo já existe, pedir para o usuário digitar a mensagem a ser gravada no console. Essa mensagem é via console. O usuário digita a mensagem dele no console, e é para ser gravada no arquivo. Fielmente, essa é a ideia. Ou seja, se no console ele aperta enter, no arquivo eu gostaria que pulasse uma linha.

Vou colocar abaixo o código:

if(verificaExiste(nomeArquivo)) {
            FileWriter fw = new FileWriter(nomeArquivo, Charset.forName("UTF-8"));
            System.out.println("Digite o conteudo do arquivo: ");
            Scanner conteudoArquivo = new Scanner(System.in);
            while(!conteudoArquivo.nextLine().equals("")) {
                fw.write("\n");
                fw.write(conteudoArquivo.nextLine());
            }            
            fw.close();
} else {
            throw new ArquivoInexistenteException();
}

Não deu certo não. O usuário pode digitar o que for, que no arquivo nao fica igual. Normalmente no arquivo só fica a ultima linha, mas é estranho, ja aconteceu caso de ficar 2 linhas, já acontece caso de concatenar linhas. Cada ora uma saída. Mas nunca como eu gostaria. Já tentei debugar, mas nao consegui pegar o erro DESCONFIO que o o erro esteja no nextLine(), acho que talvez não seja o método mais adequado. E desconfio que ao digitar no console a mensagem, o "enter" que seria a quebra de linha não tem o mesmo efeito. Mas nao conseggui chegar numa conclusão.

Depois quero fazer o processo inverso. Quero pegar o conteúdo desse arquivo e jogar no console. Também estou travado nessa parte. O FileReader aparentemente nao tem a opção de ler o arquivo e devolver uma string inteira.

Ajudas, por favor amigos? Quero sair desta parte, estou travado

1 resposta

Olá Raphael,

No seu código atual, você está chamando o método nextLine() duas vezes, o que faz com que uma linha seja lida e descartada antes de ser gravada no arquivo. Além disso, você está escrevendo uma quebra de linha antes de cada linha digitada pelo usuário, o que pode causar resultados indesejados.

Aqui está uma modificação no seu código para corrigir esses problemas:

if (verificaExiste(nomeArquivo)) {
    FileWriter fw = new FileWriter(nomeArquivo, Charset.forName("UTF-8"));
    System.out.println("Digite o conteúdo do arquivo (pressione Enter duas vezes para finalizar): ");
    Scanner conteudoArquivo = new Scanner(System.in);
    String linha = conteudoArquivo.nextLine();
    while (!linha.isEmpty()) {
        fw.write(linha);
        fw.write(System.lineSeparator()); // Quebra de linha adequada para o sistema operacional
        linha = conteudoArquivo.nextLine();
    }
    fw.close();
} else {
    throw new ArquivoInexistenteException();
}

No código acima, foi utilizado o método isEmpty() para verificar se a linha digitada pelo usuário está vazia (ou seja, apenas o Enter foi pressionado). Além disso, System.lineSeparator() é utilizado para obter a quebra de linha adequada para o sistema operacional em que o código está sendo executado.

Para ler o conteúdo do arquivo e exibi-lo no console, você pode usar a classe BufferedReader em combinação com FileReader. Aqui está um exemplo:

if (verificaExiste(nomeArquivo)) {
    FileReader fr = new FileReader(nomeArquivo);
    BufferedReader br = new BufferedReader(fr);
    String linha;
    while ((linha = br.readLine()) != null) {
        System.out.println(linha);
    }
    br.close();
} else {
    throw new ArquivoInexistenteException();
}

No código acima, br.readLine() é usado para ler cada linha do arquivo e exibi-la no console. A leitura continua até que o método readLine() retorne null, indicando o final do arquivo.

Essas modificações devem ajudar a resolver os problemas que você está enfrentando e permitir a gravação e leitura adequadas do arquivo.