J2ME下载、本地存储案例二则

 

用J2ME开发一些手机应用程序,不可避免的要接触到联网操作以及文件的上传和下载。由于种种客观条件限制,这部分调试也是相对比较麻烦的。
下面有几条需要注意的事项,新手非常容易遇到的问题。(这两个case也困扰了我一段时间.)


Case 1 .通过HttpConnection下载图片,显示,并通过FileConnection存储。


通过HttpConnection获得输入流之后,首先通过Image.createImage(InputStream stream)方法生成了下载的图片,然后显示在页面。这时,我还想存储怎么办?如果还用这个输入流,就会出问题了。查询一下API,可以发现其中的玄机。
public static Image createImage(InputStream stream)
                         throws IOExceptionCreates an immutable image from decoded image data obtained from an InputStream. This method blocks until all image data has been read and decoded. After this method completes (whether by returning or by throwing an exception) the stream is left open and its current position is undefined.

 

看了后几句有点发蒙。。。经过测试,这个流没有被close掉,但是通过available()方法测试,返回值为0,可见这个输入流此时已经不包含有用的信息了,已经没有意义了。


解决方法:如果想下载这个文件的话,就要先下载,然后再打开下载的笨的文件后,显示在页面上。这个输入流是不能复用的!

 

 

Case 2 .下载一个音乐或者视频,并存储。
下载大文件,容易犯错的就是一次性把输入流转化成byte数组,再将比特数组一次性写入文件输出流。这种方法对读取小文件没问题,但是对于上M级别的大文件,就会报错,提示内存溢出。


解决办法就是不能一次性的把输入流写入内存,而是通过缓冲甚至一个字节一个字节的读出和写入,这样就可以解决大体积文件下载的问题了。当然,这样效率会比较低。如果希望效率更高一些,我觉得把大体积切割成多分小文件(具体多少份,看需要吧,但据说J2ME是对线程总数有限制,这也要注意),然后通过多线程下载,每个线程要记载数据的偏移量。这样,效率会显著提升。

 

本人能力有限,有不正确之处,请各位给予指正。

你可能感兴趣的:(image,Stream,存储,immutable,j2me,returning)