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
相关产品推荐
相关产品推荐

