如果Assert目录文件大于1M,在读取的过程中,会出现读出来的文件,不可用。因为Assert对文件的大小有限制,这就需要特殊处理了
首先是将大文件分割成小文件,然后下到本地,进行合并
1.文件的分割
package com.cam;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import android.app.Activity;
import android.content.Context;
import android.content.Intent;
import android.content.res.AssetManager;
import android.graphics.Bitmap;
import android.graphics.Matrix;
import android.media.ThumbnailUtils;
import android.os.Bundle;
import android.os.Environment;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.Toast;
public class TestCameraActivity extends Activity {
/** Called when the activity is first created. */
private Button button1,button2;
private static final int CAPTURE_CODE = 0;
private static final int CAPTURE_CODE2 = 1;
byte[] photo;
String[] data ;
String path = "/sdcard/yjtdownload/";
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
AssetManager assetManager = getAssets();
try {
data = assetManager.list("");
System.out.println("----------"+data.length);
bind();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
/**文件的分割**/
private void spletar(){
//需要分割的文件放置的路径
String path = "/sdcard/yjtdownload/";
//需要分割的文件的文件名称
String base = "office";
//需要分割的文件的后缀名
String ext = ".apk";
//以每个小文件1024*1024字节即1M的标准来分割
int split = 1024 * 1024;
byte[] buf = new byte[1024];
int num = 1;
//建立输入流
File inFile = new File(path + base + ext);
FileInputStream fis;
try {
fis = new FileInputStream(inFile);
while (true) {
//以"demo"+num+".db"方式来命名小文件即分割后为demo1.db,demo2.db,。。。。。。
FileOutputStream fos = new FileOutputStream(new File(path + base
+ num + ext));
for (int i = 0; i < split / buf.length; i++) {
int read;
try {
read = fis.read(buf);
fos.write(buf, 0, read);
// 判断大文件读取是否结束
if (read < buf.length) {
fis.close();
fos.close();
return;
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
try {
fos.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
num++;
}
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
/**文件的合并**/
private void bind(){
if (!new File(path+"aa.apk").exists()) {
OutputStream out = null;
try {
out = new FileOutputStream(new File(path+"aa.apk") );
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
byte[] buffer = new byte[1024];
InputStream in;
int readLen = 0;
for(int i=0;i
// 获得输入流 ,注意文件的路径
System.out.println(i+"----合并第几个文件--------"+data[i]);
try {
in = TestCameraActivity.this.getAssets().open("office"+(i+1)+".apk");
while((readLen = in.read(buffer)) != -1){
out.write(buffer, 0, readLen);
}
out.flush();
in.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
// 把所有小文件都进行写操作后才关闭输出流,这样就会合并为一个文件了
try {
out.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}