我是android编程的新手,目前我正在尝试在android中压缩多个文件。在我的SD卡中创建了一个zipfile但它没有文件,显示0.00字节。在logcat我有一些例外,如
java.lang.ArrayIndexOutOfBoundsException:length = 2040; regionStart = 0; regionLength = -1
at java.util.Arrays.checkOffsetAndCount(Arrays.java:1732)
这是我的代码
package com.example.zipfile;
import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.util.zip.ZipEntry;
import java.util.zip.ZipOutputStream;
import android.util.Log;
public class CompressFile
{
public static final int Buffer=2040;
public String[]localfiles;
public String zippedFile;
public CompressFile(String[]localfileset,String zipFileset)
{
// TODO Auto-generated constructor stub
this.localfiles=localfileset;
this.zippedFile= zipFileset;
}
public void zip()
{
try
{
BufferedInputStream bufferstream=null;
FileOutputStream fileout=new FileOutputStream(zippedFile);
ZipOutputStream zipout=new ZipOutputStream(new BufferedOutputStream(fileout));
byte[]data=new byte[Buffer];
for(int i=0;i<localfiles.length;i++)
{
Log.d("add",localfiles[i]);
Log.v("Compress","AddingFiles:"+ localfiles[i]);
FileInputStream fileinput=new FileInputStream(localfiles[i]);
bufferstream=new BufferedInputStream(fileinput,Buffer);
ZipEntry zipentry=new ZipEntry(localfiles[i].substring(localfiles[i].lastIndexOf("/")+1));
zipout.putNextEntry(zipentry);
int count;
while((count=bufferstream.read(data,0,Buffer))!=-1);
{
zipout.write(data,0,count);
}
bufferstream.close();
}
zipout.close();
}
catch (Exception e)
{
e.printStackTrace();
}
}
}
和我的MainActvity代码
package com.example.zipfile;
import android.support.v7.app.ActionBarActivity;
import android.os.Bundle;
import android.os.Environment;
import android.view.Menu;
import android.view.MenuItem;
public class MainActivity extends ActionBarActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
String[]filelist=new String[2];
String path=Environment.getExternalStorageDirectory().getPath();
filelist[0]=path+"/facebooklogo1.png";
filelist[1]=path+"/formpicture.jpg";
CompressFile compress=new CompressFile(filelist,path+"/Testzip.zip");
compress.zip();
}
@Override
public boolean onCreateOptionsMenu(Menu menu)
{
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.main, menu);
return true;
}
@Override
public boolean onOptionsItemSelected(MenuItem item)
{
// Handle action bar item clicks here. The action bar will
// automatically handle clicks on the Home/Up button, so long
// as you specify a parent activity in AndroidManifest.xml.
int id = item.getItemId();
if (id == R.id.action_settings) {
return true;
}
return super.onOptionsItemSelected(item);
}
}
我不知道为什么会发生这种情况,感谢您的帮助 提前致谢
答案 0 :(得分:0)
1)检查文件路径
2) localfiles [i] .substring(localfiles [i] .lastIndexOf(&#34; /&#34;)+ 1)这应该是Zip文件的唯一条目。
`
byte[] data = new byte[4096];
// Read bytes from packed file and store them in the ZIP output stream
int bytesNum;
while ((bytesNum = bufferstream.read(data)) > 0) {
zipout.write(data, 0, bytesNum);
}
`
答案 1 :(得分:0)
我已经修改了我的代码我这次没有buffredInputStream感谢rahul的建议。这是我的代码工作
package com.example.ziptest;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.util.zip.ZipEntry;
import java.util.zip.ZipOutputStream;
import android.support.v7.app.ActionBarActivity;
import android.os.Bundle;
import android.os.Environment;
import android.util.Log;
import android.view.Menu;
import android.view.MenuItem;
public class MainActivity extends ActionBarActivity {
String path= Environment.getExternalStorageDirectory().getPath();// stating relative path of SD card rather than hard coded path
String zipfile=path+File.separator+"Filekb.zip"; // the new compressed file with its path
String storagefile1=path+File.separator+"facebooklogo1.png"; // local file which is going to be compressed
String storagefile2=path+File.separator+"formpicture.jpg"; // second local file which is going to be compressed
String[]storagefiles= {storagefile1,storagefile2};// put this local files in a array
public byte[]buffer=new byte[2040]; // create buffer
FileInputStream fileinput;
FileOutputStream fileoutput;
ZipOutputStream zipout;
@Override
protected void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
zip();
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.main, menu);
return true;
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
// Handle action bar item clicks here. The action bar will
// automatically handle clicks on the Home/Up button, so long
// as you specify a parent activity in AndroidManifest.xml.
int id = item.getItemId();
if (id == R.id.action_settings) {
return true;
}
return super.onOptionsItemSelected(item);
}
public void zip()
{
try
{
fileoutput=new FileOutputStream(zipfile);
zipout =new ZipOutputStream(fileoutput);
for(int i=0;i<storagefiles.length;i++)
{
File storagefileindex=new File(storagefiles[i]);
Log.d("Add", storagefiles[i]);
Log.v("compressing","Adding"+storagefiles[i]);
fileinput=new FileInputStream(storagefileindex);
zipout.putNextEntry(new ZipEntry(storagefileindex.getName()));
int bytecount;
while((bytecount= fileinput.read(buffer))>0)
{
zipout.write(buffer,0,bytecount);
}
zipout.closeEntry();
fileinput.close();
}
zipout.close();
}
catch(Exception ioe)
{
Log.d(zipfile, "Error occurs in Creating zip");
}
}
}