Consegui criar uma interação com o usuário, separei as classes em pacotes e fiz os imports dos pacotes. Elaborei uma lista de endereços, com a opção do usuário adicionar quantos endereços ele quiser na lista, e também trabalhei com a criação de um arquivo json com essa lista ordenada após o usuário escolher "sair". Também dentro do while, criei uma condição para que se o usuário escolher sair sem escolher nenhum cep, o arquivo json não é criado, evitando assim criar arquivos json's vazios na aplicação, evitando ocupar espaço na mémoria.
Classe principal
package br.com.alura.principal;
import br.com.alura.metodos.ConsultaCep;
import br.com.alura.modelos.Endereco;
import br.com.alura.metodos.GeradorDeArquivo;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;
public class Principal {
public static void main(String[] args) {
Scanner leitura = new Scanner(System.in);
ConsultaCep consultaCep = new ConsultaCep();
List<Endereco> enderecos = new ArrayList<>();
while (true) {
System.out.println("Digite o número de CEP para consulta (ou 'sair' para encerrar):");
String cep = leitura.nextLine();
if (cep.equalsIgnoreCase("sair")) {
break;
}
try {
Endereco novoEndereco = consultaCep.buscaEndereco(cep);
enderecos.add(novoEndereco);
} catch (RuntimeException e) {
System.out.println("Erro ao consultar o CEP: " + e.getMessage());
}
}
if (!enderecos.isEmpty()) {
try {
GeradorDeArquivo gerador = new GeradorDeArquivo();
gerador.salvaJson(enderecos);
System.out.println("Arquivo JSON criado com sucesso.");
System.out.println(enderecos);
} catch (IOException e) {
System.out.println("Erro ao criar o arquivo JSON: " + e.getMessage());
}
} else {
System.out.println("Nenhum CEP foi adicionado.");
}
System.out.println("Encerrando o programa.");
}
}
Classe gerador de arquivos
package br.com.alura.metodos;
import br.com.alura.modelos.Endereco;
import com.google.gson.Gson;
import com.google.gson.GsonBuilder;
import java.io.FileWriter;
import java.io.IOException;
import java.util.List;
public class GeradorDeArquivo {
public void salvaJson(List<Endereco> enderecos) throws IOException {
Gson gson = new GsonBuilder().setPrettyPrinting().create();
try (FileWriter escrita = new FileWriter("enderecos.json")) {
gson.toJson(enderecos, escrita);
}
}
}
Classe Endereço
package br.com.alura.modelos;
public record Endereco(String cep, String logradouro, String complemento,
String localidade, String uf) {
@Override
public String toString() {
return "(Endereco= " +
"cep= " + cep + '\'' +
", logradouro= " + logradouro + '\'' +
", complemento= " + complemento + '\'' +
", localidade= " + localidade + '\'' +
", uf= " + uf + '\'' + ")";
}
}
Classe Consulta do Cep
package br.com.alura.metodos;
import br.com.alura.modelos.Endereco;
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 Catch na classe principal para tratar exceção caso o cep seja inválido
//O try deve envolver desde o HttResponse
try {
HttpResponse<String> 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");
}
}
}