inStream.available() 读取文件

本文解决网络图片转换为Base64时因网络不稳定导致的图片传输不完整问题,提供了一种改进的方法,通过循环读取直到全部数据接收完成,确保图片完整无缺。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

问题描述:将url图片地址转成base64位字节 传输,只传输了部分文件

查找方向:base64转码方法,读取文件字节方法

问题定位:inStream.available()读取文件流长度不不完整,这个方法从本地文件读取数据时一般不会出现问题,但是通过网路传输就会出现图片传输不完整的情况,因为网络通讯是间断性的一串字节往往分几批进行发送。本地程序调用available()方法有时得到0,这可能是对方还没有响应,也可能是对方已经响应了,但是数据还没有送达本地。

 

代码事例:修改前方法--------

public static String GetUrlImageToBase64(String url) throws Exception {

 

if (url == null || "".equals(url.trim()))

return null;

URL u = new URL(url); // 打开图片路径

HttpURLConnection conn = (HttpURLConnection) u.openConnection();

// 设置请求方式为GET

conn.setRequestMethod("GET");

// 设置超时响应时间为5秒

conn.setConnectTimeout(5000);

// 通过输入流获取图片数据

InputStream inStream = conn.getInputStream();

// 读取图片字节数组

byte[] data = new byte[inStream.available()];

inStream.read(data);

inStream.close();

// 返回Base64编码过的字节数组字符串

return EncryptUtil.encodeBase64(data,"UTF-8");

}

代码事例:修改后方法--------

public static String GetUrlImageToBase64(String url) throws Exception {

 

if (url == null || "".equals(url.trim()))

return null;

URL u = new URL(url); // 打开图片路径

HttpURLConnection conn = (HttpURLConnection) u.openConnection();

// 设置请求方式为GET

conn.setRequestMethod("GET");

// 设置超时响应时间为5秒

conn.setConnectTimeout(5000);

// 通过输入流获取图片数据

InputStream inStream = conn.getInputStream();

//得到图片的二进制数据,以二进制封装得到数据,具有通用性

ByteArrayOutputStream outStream = new ByteArrayOutputStream();

//创建一个Buffer字符串

byte[] buffer = new byte[1024];

//每次读取的字符串长度,如果为-1,代表全部读取完毕

int len = 0;

//使用一个输入流从buffer里把数据读取出来

while ((len = inStream.read(buffer)) != -1) {

//用输出流往buffer里写入数据,中间参数代表从哪个位置开始读,len代表读取的长度

outStream.write(buffer, 0, len);

}

//关闭输入流

inStream.close();

byte[] data = outStream.toByteArray();

//对字节数组Base64编码

String base64 = Base64.encodeBase64String(data);

System.out.println("网络文件转base64"+url.toString()+base64);

return base64;//返回Base64编码过的字节数组字符串

}

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值