Como baixar uma imagem de uma url

Estou tentando baixar uma imagem de uma url que o ifood fornece nas suas apis.
já fiz de tudo, mas me retorna um array de bytes que se eu salvar não corresponde a uma imagem.
Ou seja a imagem não é suportada.

fiz de duas maneiras:

a primeira:

public static void leImagemUrl() throws Exception {
    
    // Sending get request
    String sUrl = "https://merchant-api.ifood.com.br/order/v1.0/orders/26826528-79e0-4bcd-a37f-d19bd5beef3e/cancellationEvidences/88d52aaf-861d-4b24-8087-9d8fd63d050f";
    URL url = new URL(sUrl);
    HttpURLConnection conn = (HttpURLConnection) url.openConnection();

    conn.setRequestProperty("Authorization", "Bearer " + Parametros.getInstanciaMaster(3).getAcessToken());
    conn.setRequestProperty("Content-Type", "application/json");
    conn.setRequestMethod("GET");

    BufferedReader in = new BufferedReader(new InputStreamReader(conn.getInputStream()));
    String output;

    StringBuffer response = new StringBuffer();
    while ((output = in.readLine()) != null) {
        response.append(output);
    }

    in.close();
    File file = new File("c:\\manda\\ax.jpeg");
    Files.write(file.toPath(), response.toString().getBytes(), StandardOpenOption.CREATE);
    
}

a segunda meneira:

private static void leImagem(long loja) throws Exception {
    String sUrl = "https://merchant-api.ifood.com.br/order/v1.0/orders/0d611f41-8315-42dd-b777-547c4e4acdd6/cancellationEvidences/6b4c058f-1928-4555-b70f-6b177f5cd312";
    configuration.property(ClientProperties.CONNECT_TIMEOUT, 20000);
    configuration.property(ClientProperties.READ_TIMEOUT, 20000);
    webTarget = client.target(sUrl);

    Response response = webTarget.request()
            .header(HttpHeaders.AUTHORIZATION, "Bearer " + Parametros.getInstanciaMaster(loja).getAcessToken())
            .get();
    System.out.println(response.getStatus());
    String sret = response.readEntity(String.class);
    System.out.println(sret);
    if (response.getStatus() == 200) {
        byte[] bytes = sret.getBytes();
        String sbase64 = Base64.getEncoder().encodeToString(bytes);

        JgsGravaArquivo.Grava(sbase64, "c:\\manda\\base64.txt");

        File file = new File("c:\\manda\\a.jpeg");
        Files.write(file.toPath(), bytes, StandardOpenOption.CREATE);
    }

    System.out.println(sret);
}

Na segunda maneira você está codificando em base 64, deveria fazer o contrário, decodificar pra obter o array de bytes original.

    public static void leImagemUrl() throws Exception {
        
    	// URL da API que retorna a string Base64
        String sUrl = "https://merchant-api.ifood.com.br/order/v1.0/orders/26826528-79e0-4bcd-a37f-d19bd5beef3e/cancellationEvidences/88d52aaf-861d-4b24-8087-9d8fd63d050f";
        
        // Faz a requisição HTTP
        URL url = new URL(sUrl);
        HttpURLConnection conn = (HttpURLConnection) url.openConnection();
        conn.setRequestProperty("Authorization", "Bearer " + Parametros.getInstanciaMaster(3).getAcessToken());
        conn.setRequestProperty("Content-Type", "application/json");
        conn.setRequestMethod("GET");

        // Lê a resposta
        Scanner scanner = new Scanner(connection.getInputStream());
        String response = scanner.useDelimiter("\\A").next();
        scanner.close();

        // Decodifica a string Base64
        byte[] imageBytes = Base64.getDecoder().decode(response);

        // Salva os bytes da imagem em um arquivo
        try (OutputStream outputStream = new FileOutputStream("C:\\manda\\ax.jpeg")) {
            outputStream.write(imageBytes);
            System.out.println("Imagem salva com sucesso!");
        }
    }

Primeiramente, um detalhe: todas as classes do pacote java.io que terminam com Reader servem para trabalhar com texto. Basicamente, todo texto (seja em um arquivo ou simplemente armazenado na memória) é convertido para bytes (usando algum encoding, leia aqui para saber mais), e ao ler faz-se o processo inverso (converte os bytes de volta para texto, usando o mesmo encoding).

Mas uma imagem não é texto, então não faz o menor sentido usar BufferedReader. O método nextLine lê a próxima linha do arquivo. Ou seja, vai lendo até encontrar uma quebra de linha (um \n, \r ou a sequência \r\n) e os demais bytes são convertidos para texto. Portanto não faz sentido usar este método para ler uma imagem. Pode até ser que encontre um byte correspondente ao \n, mas em uma imagem isso não significa que há uma quebra de linha.


Dito isso, o que essa URL do iFood retorna? Se for a própria imagem, basta ler os bytes diretamente e gravá-los no arquivo. Se for a imagem em Base 64, vc precisa decodificar (ou seja, usar Base.getDecoder().decode e gravar os bytes resultantes no arquivo).