通过android编程在压缩文件中的ArrayIndexOufofBoundExceptin

时间:2016-01-09 04:15:26

标签: java android

我是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);
    }
}

我不知道为什么会发生这种情况,感谢您的帮助 提前致谢

2 个答案:

答案 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");
        }

    }




}