美文网首页
inputSteam.available()的注意事项

inputSteam.available()的注意事项

作者: nyxixi | 来源:发表于2018-03-13 19:38 被阅读0次

    为了给自己的网站加入图像识别,引入了百度大脑的api,但是需要将网络图片转换成base64的编码格式。在网上找的程序一般是这样的

    public static String getImageStrFromUrl(String imgURL) {
            byte[] data = null;
            try {
                // 创建URL
                URL url = new URL(imgURL);
                // 创建链接
                HttpURLConnection conn = (HttpURLConnection) url.openConnection();
                conn.setRequestMethod("GET");
                conn.setConnectTimeout(5 * 1000);
                InputStream inStream = conn.getInputStream();
                data = new byte[inStream.available()];
                inStream.read(data);
                inStream.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
            // 对字节数组Base64编码
            BASE64Encoder encoder = new BASE64Encoder();
            // 返回Base64编码过的字节数组字符串
            return encoder.encode(data);
        }
    

    但是经过反复测试,结果和本地图片(同一张)生成的base64编码差距很大,少了一半以上的字节,查询了相关资料,
    返回此输入流下一个方法调用可以不受阻塞地从此输入流读取(或跳过)的估计字节数。下一个调用可能是同一个线程,也可能是另一个线程。一次读取或跳过此估计数个字节不会受阻塞,但读取或跳过的字节数可能小于该数。
    最终的解决办法

    /**
         * 根据地址获得数据的字节流
         * @param strUrl 网络连接地址
         * @return
         */
        public static byte[] getImageFromNetByUrl(String strUrl){
            try {
                URL url = new URL(strUrl);
                HttpURLConnection conn = (HttpURLConnection)url.openConnection();
                conn.setRequestMethod("GET");
                conn.setConnectTimeout(5 * 1000);
                InputStream inStream = conn.getInputStream();//通过输入流获取图片数据
                byte[] btImg = readInputStream(inStream);//得到图片的二进制数据
                return btImg;
            } catch (Exception e) {
                e.printStackTrace();
            }
            return null;
        }
        /**
         * 从输入流中获取数据
         * @param inStream 输入流
         * @return
         * @throws Exception
         */
        public static byte[] readInputStream(InputStream inStream) throws Exception{
            ByteArrayOutputStream outStream = new ByteArrayOutputStream();
            byte[] buffer = new byte[1024];
            int len = 0;
            while( (len=inStream.read(buffer)) != -1 ){
                outStream.write(buffer, 0, len);
            }
            inStream.close();
            return outStream.toByteArray();
        }

    相关文章

      网友评论

          本文标题:inputSteam.available()的注意事项

          本文链接:https://www.haomeiwen.com/subject/knktqftx.html