Olá professores e professoras!
Vai nova versão com uma nova classe ValidaCep para realizar teste de validação o que pode render economia de recursos de tempo de processamento, de acesso a rede externa e de tanto outros problemas que podem ser evitados. Testar a validação dos dados de entrada informados em qualquer aplicação é ótima prática de programação. Evitar que o usuário digite qualquer coisa e trave, provoque erros e paralise o sistema é sempre bem vindo.
Usei também janelas para a entrada do CEP e exibir menssagens o que aprendi em outro curso que fiz de programação comercial com java e banco de dados MySQL no Instituto Federal de Rondônia - IFRO
Fiz uma mudança no código da classe GeradorDeArquivo.java com o uso do BufferedWriter.
Principal.java
import javax.swing.;
//import javax.swing.JOptionPane;
import java.awt.;
import java.io.IOException;
import java.util.Scanner;
public class Principal {
public static void main(String[] args) {
//classe externa para validar um CEP
ValidaCEP validator = new ValidaCEP();
//Criação do TextField para entrada de dados
JTextField textField = new JTextField();
JOptionPane.showMessageDialog(null, textField, "Digite o CEP p/ consulta (só números):", JOptionPane.PLAIN_MESSAGE);
//Captura do texto inserido no TextField
String cep = textField.getText();
ConsultaCep consultaCep = new ConsultaCep();
if (!validator.isValidFormat(cep)) {
JOptionPane.showMessageDialog(null, "CEP inválido! Digite exatamente 8 números. Use 00000-000 ou 00000000.",
"Erro",
JOptionPane.ERROR_MESSAGE);
return;
}
try {
Endereco novoEndereco = consultaCep.buscaEndereco(cep);
System.out.println(novoEndereco);
GeradorDeArquivo gerador = new GeradorDeArquivo();
gerador.salvaJson(novoEndereco);
} catch (RuntimeException | IOException e) {
System.out.println(e.getMessage());
JOptionPane.showMessageDialog(
null,
e.getMessage(),
"Erro",
JOptionPane.ERROR_MESSAGE
);
JOptionPane.showMessageDialog(null, "Finalizando a aplicação");
//System.out.println("Finalizando a aplicação");
}
}
}
ValidaCEP.java
import java.util.Scanner;
import java.util.regex.Pattern;
public class ValidaCEP {
private static final Pattern CEP_PATTERN = Pattern.compile("^\d{5}-?\d{3}$");
/**
* Valida o formato do CEP.
*
* @param cep CEP informado pelo usuário.
* @return true se o formato for válido, false caso contrário.
*/
public boolean isValidFormat(String cep) {
if (cep == null) return false;
return CEP_PATTERN.matcher(cep).matches();
}
}
Endereco.java
public record Endereco(String cep, String logradouro,
String complemento, String bairro,
String localidade, String uf) {
}
ConsultaCep.java
import com.google.gson.Gson;
import java.io.IOException;
import java.net.URI;
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;
public class ConsultaCep {
public Endereco buscaEndereco(String cep) {
URI endereco = URI.create("https://viacep.com.br/ws/" + cep + "/json/");
HttpRequest request = HttpRequest.newBuilder()
.uri(endereco)
.build();
try {
HttpResponse response = HttpClient
.newHttpClient()
.send(request, HttpResponse.BodyHandlers.ofString());
return new Gson().fromJson(response.body(), Endereco.class);
} catch (Exception e) {
throw new RuntimeException("Não consegui obter o endereço a partir desse CEP.");
}
}
}
GeradorDeArquivo.java
import com.google.gson.Gson;
import com.google.gson.GsonBuilder;
import java.io.BufferedWriter;
import java.io.FileWriter;
import java.io.IOException;
public class GeradorDeArquivo {
public void salvaJson(Endereco endereco) throws IOException {
Gson gson = new GsonBuilder().setPrettyPrinting().create();
//Principais Pontos:
//• FileWriter: Cria o arquivo ou o abre para gravação.
//• BufferedWriter: Melhora a performance da escrita.
//BufferedWriter + FileWriter → Cria e escreve no arquivo.
BufferedWriter escrita = new BufferedWriter(new FileWriter(endereco.cep()+ ".json" ));
//(endereco.cep() + ".json");
escrita.write(gson.toJson(endereco));
escrita.close();
}
}