inStream.available() 读取文件

问题描述:将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编码过的字节数组字符串

}

你可能感兴趣的:(inStream.available() 读取文件)