在前面已经写了android如果使用ksoap2包来进行远程调用服务,调用服务方法的时候有时候需要传递参数,传递一些基本类型参数到没什么,如果在上传文件或下载数据的时候呢?大家都知道byte,byte是这样定义的,byte是通过网络传输信息的单位,网络上所有的信息都是以bit为单位传递的,一个bit代表一个0或1,8个bit等于1byte。当我们需要将手机本地的数据经过xml文件上传到服务端的时候,就需要把xml文件转换成byte才能成功上传。

下面是代码以及过程:

首先要将文件转换成InputStream,本人在这里进行了文件压缩:

 1 // 对文件进行压缩 2     public static byte[] compressToByte(File file) { 3         try { 4             InputStream inputStream = new FileInputStream(file); 5             ByteArrayOutputStream out = new ByteArrayOutputStream(); 6             GZIPOutputStream gzip = new GZIPOutputStream(out); 7             byte[] bytes = new byte[1024]; 8             int count = 0; 9             while ((count = inputStream.read(bytes)) > -1) {10                 gzip.write(bytes, 0, count);11             }12             gzip.finish();13             gzip.close();14             inputStream.close();15             return out.toByteArray();16         } catch (Exception e) {17             // TODO: handle exception18             e.getStackTrace();19         }20         return null;21     }

压缩以后 返回的是byte[],服务端的参数类型也是byte[] ,目前转换成biye[]数组,以为就直接可以这样写就可以上传了么!

soapObject.addProperty("bytes", bytes);

这样上传是不成功的,我们需要在call之前用Base64进行register.

new MarshalBase64().register(envelope);

Base64网络上最常见的用于传输8Bit字节码的编码方式之一,当我们上传数据量很大的时候,像xml这种数据型文件,Base64编码可用于在HTTP环境下传递较长的标识信息。采用Base64编码不仅比较简短,同时也具有不可读性,即所编码的数据不会被人用肉眼所直接看到。关于Base64的知识,请到

http://baike.baidu.com/view/469071.htm去详细了解。

前面是上传数据,接下来是下载数据,服务端传回压缩后的xml字节数组,在bodyIn后,传回来的byte[]数据直接写成xml的话是乱码,这时需要以下操作:

一、如果是Base64需要先进行:

     byte[] bytes=Base64.decode(resulObject.getProperty(0).toString());

二、由于该文件是zip压缩文件的byte,需要对其写成zip文件

//把获取到的字节流写入zip文件          File files=new File(activity.getFilesDir(), "huirongassets.zip");          FileOutputStream fs=new FileOutputStream(files);          fs.write(bytes, 0, bytes.length);          fs.flush();          fs.close();

三、对该zip文件进行解压:

 1  public byte[] unGZip(InputStream inputStream){ 2          byte[] b=null; 3          try { 4             //Gzip输入流 5              GZIPInputStream gzip=new GZIPInputStream(inputStream); 6             byte[] bytes=new byte[31240]; 7             int num=-1; 8             ByteArrayOutputStream baos=new ByteArrayOutputStream(); 9             while((num=gzip.read(bytes,0,bytes.length))>-1){10                 baos.write(bytes, 0, num);11             }12             b=baos.toByteArray();13             baos.flush();14             baos.close();15             gzip.close();16             return b;17          } catch (Exception e) {18             // TODO: handle exception19             e.getStackTrace();20         }21          return null;22      }

四、解压后返回解压后的字节数组 这时候byte[]是xml文件了:

1 File file=new File(activity.getFilesDir(), "dataversion.xml");2          FileOutputStream outputStream=new FileOutputStream(file);3          outputStream.write(bytes, 0, bytes.length);4          outputStream.flush();5          outputStream.close();

五、最后用xml解析器解析,关于解析器会后面再详细记录。android内嵌了pull解析器,java中还有SAX解析器,DOC解析器。

解析完毕后就可以获取服务端的数据了。

更多相关文章

  1. 一款常用的 Squid 日志分析工具
  2. GitHub 标星 8K+!一款开源替代 ls 的工具你值得拥有!
  3. “罗永浩抖音首秀”销售数据的可视化大屏是怎么做出来的呢?
  4. Nginx系列教程(三)| 一文带你读懂Nginx的负载均衡
  5. RHEL 6 下 DHCP+TFTP+FTP+PXE+Kickstart 实现无人值守安装
  6. Linux 环境下实战 Rsync 备份工具及配置 rsync+inotify 实时同步
  7. 不吹不黑!GitHub 上帮助人们学习编码的 12 个资源,错过血亏...
  8. Java采用JNI调用VC++生成的dll(Java与C++交互)
  9. Android(安卓)两个Fragment之间的跳转和数据的传递实例详解

随机推荐

  1. android2.2资源文件详解2--tween动画
  2. 2017-06-10-Activity启动模式的区别
  3. Android(安卓)NDK 编译FFmpeg(不需要复杂
  4. android-opencv 版本下JNI Android.mk文
  5. android 4.1 UI 工具测试的新利器, uiauto
  6. Android之Sax解析xml(4)
  7. iOS 不能播放远程视频(Android(安卓)可以)
  8. Android2.3 的安装地址
  9. Android(安卓)app内部启动qq/跳转到QQ添
  10. [Android]使用Dagger 2依赖注入 - 图表创