1. 由于android自身的原因,对大文件(如影视频文件)的操作很容易造成OOM,即:Dalvik堆内存溢出,利用文件分割将大文件分割为小文件可以解决问题。

  • 文件分割后分多次请求服务。
     1 //文件分割上传 2     public  void cutFileUpload(String fileType,String filePath) 3     { 4         try 5         { 6             FileAccessI fileAccessI = new FileAccessI(filePath, 0); 7             Long nStartPos = 0l; 8             Long length = fileAccessI.getFileLength(); 9             int mBufferSize = 1024 * 100; //每次处理1024 * 100字节10             byte[] buffer = new byte[mBufferSize];11             FileAccessI.Detail detail;12             long nRead = 0l;13             String vedioFileName = Usual.f_getUUID(); //分配一个文件名14             long nStart = nStartPos;15             int i = 0;16             while (nStart < length)17             {18                 detail = fileAccessI.getContent(nStart);19                 nRead = detail.length;20                 buffer = detail.b;21                 JSONObject mInDataJson = new JSONObject();22                 mInDataJson.put("a", "282");23                 mInDataJson.put("FileName", vedioFileName);24                 mInDataJson.put("start", nStart); //服务端获取开始文章进行写文件25                 mInDataJson.put("filetype", fileType);26                 nStart += nRead;27                 nStartPos = nStart;28                 String url = UsualA.f_getXmlSOAUrl(UsualA.mServiceFastByteUrl, "n.uploadvedio", mInDataJson.toString(),29                         "282");30                 HttpFastUtil.f_httpPostByte(url, buffer, false);31             }32         }33         catch (Exception e)34         {35         }

  • 文件分割类
     1 package ishitong.mppsp.android.util; 2  3 import java.io.*; 4  5 public class FileAccessI implements Serializable 6 { 7  8     RandomAccessFile oSavedFile; 9     long nPos;10 11 12     public FileAccessI() throws IOException13     {14         this("", 0);15     }16     public FileAccessI(String sName, long nPos) throws IOException17     {18         oSavedFile = new RandomAccessFile(sName, "rw");//创建一个随机访问文件类,可读写模式19         this.nPos = nPos;20         oSavedFile.seek(nPos);21     }22     public synchronized int write(byte[] b, int nStart, int nLen)23     {24         int n = -1;25         try26         {27             oSavedFile.write(b, nStart, nLen);28             n = nLen;29         }30         catch (IOException e)31         {32             e.printStackTrace();33         }34         return n;35     }36     //每次读取102400字节37     public synchronized Detail getContent(long nStart)38     {39         Detail detail = new Detail();40         detail.b = new byte[102400];41         try42         {43             oSavedFile.seek(nStart);44             detail.length = oSavedFile.read(detail.b);45         }46         catch (IOException e)47         {48             e.printStackTrace();49         }50         return detail;51     }52 53 54     public class Detail55     {56 57         public byte[] b;58         public int length;59     }60 61     //获取文件长度62     public long getFileLength()63     {64         Long length = 0l;65         try66         {67             length = oSavedFile.length();68         }69         catch (IOException e)70         {71             // TODO Auto-generated catch block72             e.printStackTrace();73         }74         return length;75     }76 }
  • 服务端获得分割的文件,利用RandomAccessFile进行文件整理
     1 /** 2      * 音视频图片处理 3      * @param mStr 4      * @return 5      * @throws Exception 6      */ 7     public static String f_uploadVedio(String mStr) throws Exception 8     { 9         String mResult = Usual.mEmpty;10         String fileType = Usual.mEmpty;11         int startPosL = 0;12         RandomAccessFile oSavedFile = null;13         JSONObject jsonObject = new JSONObject(mStr);14         String vedioJsonStr = jsonObject.getString("VEDIO");15         byte[] vedioBytes = Usual.f_fromBase64String(vedioJsonStr);16         startPosL = (Integer) jsonObject.get("start"); //接收客户端的开始位置(文件读取到的字节大小)17         fileType = (String)jsonObject.getString("filetype");18         String fileName = (String)jsonObject.getString("FileName");19         if(fileType.equals("picture"))20         {21             oSavedFile = new RandomAccessFile("E:\\"+fileName+".jpg","rw");22         }23         else if(fileType.equals("photo"))24         {25             oSavedFile = new RandomAccessFile("E:\\"+fileName+".jpg","rw");26         }27         else if(fileType.equals("voice"))28          {29             oSavedFile = new RandomAccessFile("E:\\"+fileName+".mp3","rw");30         }31         else if(fileType.equals("video")) 32         {33             oSavedFile = new RandomAccessFile("E:\\"+fileName+".mp4", "rw");34         }35         //设置标志位,标志文件存储的位置36         oSavedFile.seek(startPosL);37         oSavedFile.write(vedioBytes);38         oSavedFile.close();39         mResult = "000";40         return mResult;41     }

更多相关文章

  1. android 项目串口通信(serialPort)开发遇到的炕
  2. Android(安卓)DataBinding的简单使用
  3. Android下pm 命令详解
  4. Android(安卓)studio配置Opencv开发环境
  5. android背景选择器selector用法汇总
  6. csr8811蓝牙芯片porting总结
  7. android通用文件操作
  8. android播放网络音频
  9. NPM 和webpack 的基础使用

随机推荐

  1. Android 获取手机屏幕大小两种方法
  2. android ViewPager学习笔记1
  3. android添加监听器
  4. Android(安卓)混淆打包
  5. Android WIFI,蓝牙,电池,背光,SD卡,摄像头,按键
  6. Android adb.exe程序启动不起来
  7. android Activity间List传值
  8. Android 消息通知栏Notification使用和权
  9. Android Property实现介绍
  10. 如何获得Android的System Bar’s Height