You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Java从网页读取图片写入文件失败:生成文件无法打开

图片下载后无法打开?问题出在这!

嘿,我一眼就瞅出你代码里的关键问题了——你居然用字符流来处理图片这种二进制文件!这就像用筷子喝汤,完全找错工具啦😅

为啥会失败?

InputStreamReader 和 BufferedReader 是专门给文本数据设计的,它们会把字节转换成字符时做编码转换,这个过程会直接破坏图片的原始二进制结构,导致保存后的文件彻底损坏,自然没法被图片查看器识别。

修正后的代码(直接能用)

import java.io.BufferedInputStream;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.URL;

public class ImageDownloader {
    public static void main(String[] args) {
        try {
            // 先把URL前后的空格去掉,不然可能连不上哦
            URL urlpic = new URL("https://static.asset.aparat.com/lp/16107806-6200-m.jpg");
            HttpURLConnection connectionToPicFile = (HttpURLConnection) urlpic.openConnection();
            
            // 改用字节流读取二进制数据,这才是处理图片的正确姿势
            InputStream in = new BufferedInputStream(connectionToPicFile.getInputStream());
            FileOutputStream fout = new FileOutputStream("D://pic.jpg");
            
            // 用缓冲区提升读写速度,比逐字节快多了
            byte[] buffer = new byte[1024];
            int bytesRead;
            while ((bytesRead = in.read(buffer)) != -1) {
                fout.write(buffer, 0, bytesRead);
            }
            
            // 别忘了关闭流哦
            in.close();
            fout.close();
            System.out.println("图片下载成功啦!");
        } catch (Exception ex) {
            System.out.println("出错啦:" + ex.toString() + " " + ex.getMessage());
        }
    }
}

关键改动点

  • 把字符流换成字节流:用BufferedInputStream读取原始二进制数据,完全不会修改图片的字节信息。
  • 加了缓冲区:byte[] buffer 一次读1024字节,大幅提升下载效率。
  • 清理了URL空格:原URL前后有空格,这可能导致连接失败,已经帮你去掉了。
  • 精准写入:fout.write(buffer, 0, bytesRead) 确保只写入实际读取到的字节,避免多余的空数据。

更省心的写法(Java 7+推荐)

如果你的Java版本是7及以上,推荐用try-with-resources语法,它会自动帮你关闭流,不用手动写close(),代码更简洁安全:

import java.io.BufferedInputStream;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.URL;

public class ImageDownloader {
    public static void main(String[] args) {
        try (
            URL urlpic = new URL("https://static.asset.aparat.com/lp/16107806-6200-m.jpg");
            HttpURLConnection connectionToPicFile = (HttpURLConnection) urlpic.openConnection();
            InputStream in = new BufferedInputStream(connectionToPicFile.getInputStream());
            FileOutputStream fout = new FileOutputStream("D://pic.jpg")
        ) {
            byte[] buffer = new byte[1024];
            int bytesRead;
            while ((bytesRead = in.read(buffer)) != -1) {
                fout.write(buffer, 0, bytesRead);
            }
            System.out.println("图片下载成功啦!");
        } catch (Exception ex) {
            System.out.println("出错啦:" + ex.toString() + " " + ex.getMessage());
        }
    }
}

内容的提问来源于stack exchange,提问作者Soheil Rahsaz

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 03:34:06