কীভাবে প্রোগ্রামগুলিতে অ্যান্ড্রয়েডে ফাইল আনজিপ করবেন?


131

আমার একটি ছোট কোড স্নিপেট দরকার যা প্রদত্ত .zip ফাইল থেকে কয়েকটি ফাইল আনজিপ করে এবং জিপ করা ফাইলটিতে যে ফর্ম্যাট ছিল সে অনুযায়ী আলাদা ফাইল দেয়। আপনার জ্ঞান পোস্ট করুন এবং আমাকে সাহায্য করুন।


1
আপনি এখানে Kotlin সমাধান পেতে পারেন - stackoverflow.com/a/50990992/1162784
arsent

উত্তর:


140

পেনোর সংস্করণটি কিছুটা অনুকূল হয়েছিল। কর্মক্ষমতা বৃদ্ধি অনুধাবনযোগ্য।

private boolean unpackZip(String path, String zipname)
{       
     InputStream is;
     ZipInputStream zis;
     try 
     {
         String filename;
         is = new FileInputStream(path + zipname);
         zis = new ZipInputStream(new BufferedInputStream(is));          
         ZipEntry ze;
         byte[] buffer = new byte[1024];
         int count;

         while ((ze = zis.getNextEntry()) != null) 
         {
             filename = ze.getName();

             // Need to create directories if not exists, or
             // it will generate an Exception...
             if (ze.isDirectory()) {
                File fmd = new File(path + filename);
                fmd.mkdirs();
                continue;
             }

             FileOutputStream fout = new FileOutputStream(path + filename);

             while ((count = zis.read(buffer)) != -1) 
             {
                 fout.write(buffer, 0, count);             
             }

             fout.close();               
             zis.closeEntry();
         }

         zis.close();
     } 
     catch(IOException e)
     {
         e.printStackTrace();
         return false;
     }

    return true;
}

12
<ব্যবহার-অনুমতি অ্যান্ড্রয়েড: নাম = "android.permission.WRITE_EXTERNAL_STORAGE" />
লু মর্দা

1
আমি মনে করি হ্যাঁ, এটি কাজ করে, কারণ এটি জিনিসগুলিকে আনপ্যাক করার খুব স্বাভাবিক উপায়। সঠিক 'পথ' এবং 'জিপনেম' পেতে কেবল পরিচালনা করুন manage আপনার আগ্রহী হতে পারে এমন কিছু জিনিস আমিও দেখেছি (নিশ্চিত আপনি এটি ইতিমধ্যে দেখেছেন): লিঙ্ক
ভ্যাসিলি সোচিনস্কি

1
কারণ আপনার যদি zeডিরেক্টরি হয় তবে আপনার "ফাইল-কেবল" অপারেশনগুলি এড়িয়ে যেতে হবে । এই ক্রিয়াকলাপগুলি সম্পাদন করার চেষ্টা করা ব্যতিক্রম ঘটবে।
ভ্যাসিলি সোচিনস্কি

1
এই উত্তরটি কাজ করা উচিত নয়, কারণ এটি ডেটা লেখার জন্য অনুপস্থিত ফাইলগুলি তৈরি করে না !!
ওমর হোসামএলডিন

1
প্রকৃতপক্ষে, এই কোডটি কাজ করবে না যদি জিপ ফাইলটি জাঙ্ক পাথ ছাড়াই তৈরি করা হয়, উদাহরণস্বরূপ, আপনি এইপিপি ফাইলটি আনজিপ করতে এই কোডটি চালাতে পারেন, আপনি ফাইলনটফাউন্ডএক্সেপশন পাবেন।

99

ভ্যাসিলি সোচিনস্কির উত্তরের উপর ভিত্তি করে কিছুটা টুইট হয়েছে এবং একটি ছোট ফিক্স সহ:

public static void unzip(File zipFile, File targetDirectory) throws IOException {
    ZipInputStream zis = new ZipInputStream(
            new BufferedInputStream(new FileInputStream(zipFile)));
    try {
        ZipEntry ze;
        int count;
        byte[] buffer = new byte[8192];
        while ((ze = zis.getNextEntry()) != null) {
            File file = new File(targetDirectory, ze.getName());
            File dir = ze.isDirectory() ? file : file.getParentFile();
            if (!dir.isDirectory() && !dir.mkdirs())
                throw new FileNotFoundException("Failed to ensure directory: " +
                        dir.getAbsolutePath());
            if (ze.isDirectory())
                continue;
            FileOutputStream fout = new FileOutputStream(file);
            try {
                while ((count = zis.read(buffer)) != -1)
                    fout.write(buffer, 0, count);
            } finally {
                fout.close();
            }
            /* if time should be restored as well
            long time = ze.getTime();
            if (time > 0)
                file.setLastModified(time);
            */
        }
    } finally {
        zis.close();
    }
}

উল্লেখযোগ্য পার্থক্য

  • public static - এটি একটি স্থির ইউটিলিটি পদ্ধতি যা যে কোনও জায়গায় হতে পারে।
  • 2 টি Fileপরামিতি Stringহ'ল: / ফাইলগুলির জন্য এবং জিপ ফাইলটি আগে কোথায় বের করা হবে তা নির্দিষ্ট করতে পারেনি। এছাড়াও সংক্ষিপ্তকরণ path + filename> https://stackoverflow.com/a/412495/995891
  • throws- কারণ দেরিতে ধরুন - তাদের মধ্যে সত্যই আগ্রহী না হলে একটি চেষ্টা করুন add
  • আসলে সমস্ত ক্ষেত্রে প্রয়োজনীয় ডিরেক্টরি উপস্থিত রয়েছে তা নিশ্চিত করে all প্রতিটি জিপ ফাইল এন্ট্রি আগাম সমস্ত প্রয়োজনীয় ডিরেক্টরি এন্ট্রি ধারণ করে না। এটিতে 2 টি সম্ভাব্য বাগ রয়েছে:
    • যদি জিপটিতে একটি খালি ডিরেক্টরি থাকে এবং ফলস্বরূপ ডিরেক্টরিটির পরিবর্তে একটি বিদ্যমান ফাইল থাকে তবে এটিকে উপেক্ষা করা হবে। এর রিটার্ন মানটি mkdirs()গুরুত্বপূর্ণ is
    • ডিরেক্টরিগুলি না থাকা জিপ ফাইলগুলিতে ক্রাশ হতে পারে।
  • লেখার বাফারের আকার বৃদ্ধি পেয়েছে, এতে পারফরম্যান্সটি কিছুটা উন্নতি করা উচিত। স্টোরেজ সাধারণত 4 কে ব্লকে থাকে এবং ছোট অংশগুলিতে লেখা সাধারণত প্রয়োজনের চেয়ে ধীর হয়।
  • finallyরিসোর্স ফাঁস রোধ করতে ম্যাজিক ব্যবহার করে ।

সুতরাং

unzip(new File("/sdcard/pictures.zip"), new File("/sdcard"));

আসল সমতুল্য করা উচিত

unpackZip("/sdcard/", "pictures.zip")

হ্যালো আমি এসডিকার্ড / টেম্প / 686868 \ 6969৯.json এর মতো পশ্চাদপদ স্ল্যাশের সাথে পথ পাচ্ছি তাই আমি ত্রুটি পাচ্ছি আপনি কীভাবে এটি পরিচালনা করবেন তা আপনি আমাকে বলতে পারেন
Ando Masahashi

@ অ্যান্ডোমাসাহাসি যা একটি লিনাক্স ফাইল সিস্টেমে আইনী ফাইল নাম হওয়া উচিত। আপনি কী ত্রুটি পেয়েছেন এবং ফাইলের নামটি দেখতে কেমন হওয়া উচিত?
zapl

এটি দেখতে / sdcard/pictures\picturess.jpeg এবং ত্রুটির ফাইল ত্রুটি পাওয়া যায় নি
Ando Masahashi

এটি সূক্ষ্মভাবে কাজ করে, তবে জিপের অভ্যন্তরে কোনও ফাইলের নাম না থাকলে এটি ব্যতিক্রম ছুঁড়ে দেয় UTF8 format। সুতরাং, আমি পরিবর্তে এই কোডটি ব্যবহার করেছি যা commons-compressঅ্যাপাচের লিব ব্যবহার করে ।
আশীষ

@ আশিষতন্ন আসলেই এটি একটি সমস্যাযুক্ত
xuemingshen/

26

এটি আমার আনজিপ পদ্ধতি, যা আমি ব্যবহার করি:

private boolean unpackZip(String path, String zipname)
{       
     InputStream is;
     ZipInputStream zis;
     try 
     {
         is = new FileInputStream(path + zipname);
         zis = new ZipInputStream(new BufferedInputStream(is));          
         ZipEntry ze;

         while((ze = zis.getNextEntry()) != null) 
         {
             ByteArrayOutputStream baos = new ByteArrayOutputStream();
             byte[] buffer = new byte[1024];
             int count;

             String filename = ze.getName();
             FileOutputStream fout = new FileOutputStream(path + filename);

             // reading and writing
             while((count = zis.read(buffer)) != -1) 
             {
                 baos.write(buffer, 0, count);
                 byte[] bytes = baos.toByteArray();
                 fout.write(bytes);             
                 baos.reset();
             }

             fout.close();               
             zis.closeEntry();
         }

         zis.close();
     } 
     catch(IOException e)
     {
         e.printStackTrace();
         return false;
     }

    return true;
}

আপনি কি ভাবেন যে একই কোডটি এক্সপেনশন এপিপি এক্সপেনশন ফাইলগুলি ওবিপি ফাইল আনজিপিং বা আনপ্যাক করার জন্য কাজ করে?
LOG_TAG

13

অ্যান্ড্রয়েডের বিল্ট-ইন জাভা এপিআই রয়েছে। পরীক্ষা করে দেখুন java.util.zip প্যাকেজ।

ক্লাস জিপআইপুট স্ট্রিম হ'ল আপনার কী দেখা উচিত। জিপইন্ট্রিস্ট্রিম থেকে জিপইন্ট্রি পড়ুন এবং এটিকে ফাইলসিস্টেম / ফোল্ডারে ফেলে দিন। জিপ ফাইলে সংকোচনের জন্য অনুরূপ উদাহরণ পরীক্ষা করুন।


6
আপনার একটি কোড উদাহরণ সরবরাহ করা উচিত ছিল। আপনি অনেক পয়েন্ট মিস করেছেন।
ক্যামেরন লোয়েল পামার

10

কোটলিন পথ

//FileExt.kt

data class ZipIO (val entry: ZipEntry, val output: File)

fun File.unzip(unzipLocationRoot: File? = null) {

    val rootFolder = unzipLocationRoot ?: File(parentFile.absolutePath + File.separator + nameWithoutExtension)
    if (!rootFolder.exists()) {
       rootFolder.mkdirs()
    }

    ZipFile(this).use { zip ->
        zip
        .entries()
        .asSequence()
        .map {
            val outputFile = File(rootFolder.absolutePath + File.separator + it.name)
            ZipIO(it, outputFile)
        }
        .map {
            it.output.parentFile?.run{
                if (!exists()) mkdirs()
            }
            it
        }
        .filter { !it.entry.isDirectory }
        .forEach { (entry, output) ->
            zip.getInputStream(entry).use { input ->
                output.outputStream().use { output ->
                    input.copyTo(output)
                }
            }
        }
    }

}

ব্যবহার

val zipFile = File("path_to_your_zip_file")
file.unzip()

7

ইতিমধ্যে উত্তরগুলি এখানে ভালভাবে কাজ করার সময়, আমি দেখতে পেয়েছি যে সেগুলি আমি আশা করেছিলাম তার চেয়ে কিছুটা ধীর ছিল। পরিবর্তে আমি জিপ 4 জ ব্যবহার করেছি , যা আমি মনে করি তার গতির কারণে এটি সেরা সমাধান। এটি সংকোচনের পরিমাণের জন্য বিভিন্ন বিকল্পের জন্যও অনুমতি দিয়েছে, যা আমি দরকারী বলে মনে করি।


6

২০১DATE আপডেট করুন নিম্নলিখিত ক্লাসটি ব্যবহার করুন

    package com.example.zip;

    import java.io.BufferedOutputStream;
    import java.io.File;
    import java.io.FileInputStream;
    import java.io.FileOutputStream;
    import java.util.zip.ZipEntry;
    import java.util.zip.ZipInputStream;
    import android.util.Log;

    public class DecompressFast {



 private String _zipFile; 
  private String _location; 

  public DecompressFast(String zipFile, String location) { 
    _zipFile = zipFile; 
    _location = location; 

    _dirChecker(""); 
  } 

  public void unzip() { 
    try  { 
      FileInputStream fin = new FileInputStream(_zipFile); 
      ZipInputStream zin = new ZipInputStream(fin); 
      ZipEntry ze = null; 
      while ((ze = zin.getNextEntry()) != null) { 
        Log.v("Decompress", "Unzipping " + ze.getName()); 

        if(ze.isDirectory()) { 
          _dirChecker(ze.getName()); 
        } else { 
          FileOutputStream fout = new FileOutputStream(_location + ze.getName()); 
         BufferedOutputStream bufout = new BufferedOutputStream(fout);
          byte[] buffer = new byte[1024];
          int read = 0;
          while ((read = zin.read(buffer)) != -1) {
              bufout.write(buffer, 0, read);
          }




          bufout.close();

          zin.closeEntry(); 
          fout.close(); 
        } 

      } 
      zin.close(); 


      Log.d("Unzip", "Unzipping complete. path :  " +_location );
    } catch(Exception e) { 
      Log.e("Decompress", "unzip", e); 

      Log.d("Unzip", "Unzipping failed");
    } 

  } 

  private void _dirChecker(String dir) { 
    File f = new File(_location + dir); 

    if(!f.isDirectory()) { 
      f.mkdirs(); 
    } 
  } 


 }

ব্যবহারবিধি

 String zipFile = Environment.getExternalStorageDirectory() + "/the_raven.zip"; //your zip file location
    String unzipLocation = Environment.getExternalStorageDirectory() + "/unzippedtestNew/"; // destination folder location
  DecompressFast df= new DecompressFast(zipFile, unzipLocation);
    df.unzip();

অনুমতিসমূহ

 <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
 <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />

ফাইলের নামটি দেখতে পারেন, তবে ফাইলটি অতিরিক্ত করার চেষ্টা করার সময়, আমি ফাইলনটফাউন্ডএক্সপশন ত্রুটি পেয়ে যাচ্ছি
পার্থ আঞ্জারিয়া

5

@ জ্যাপল উত্তর অনুসারে, অগ্রগতি রিপোর্ট সহ আনজিপ করুন:

public interface UnzipFile_Progress
{
    void Progress(int percent, String FileName);
}

// unzip(new File("/sdcard/pictures.zip"), new File("/sdcard"));
public static void UnzipFile(File zipFile, File targetDirectory, UnzipFile_Progress progress) throws IOException,
        FileNotFoundException
{
    long total_len = zipFile.length();
    long total_installed_len = 0;

    ZipInputStream zis = new ZipInputStream(new BufferedInputStream(new FileInputStream(zipFile)));
    try
    {
        ZipEntry ze;
        int count;
        byte[] buffer = new byte[1024];
        while ((ze = zis.getNextEntry()) != null)
        {
            if (progress != null)
            {
                total_installed_len += ze.getCompressedSize();
                String file_name = ze.getName();
                int percent = (int)(total_installed_len * 100 / total_len);
                progress.Progress(percent, file_name);
            }

            File file = new File(targetDirectory, ze.getName());
            File dir = ze.isDirectory() ? file : file.getParentFile();
            if (!dir.isDirectory() && !dir.mkdirs())
                throw new FileNotFoundException("Failed to ensure directory: " + dir.getAbsolutePath());
            if (ze.isDirectory())
                continue;
            FileOutputStream fout = new FileOutputStream(file);
            try
            {
                while ((count = zis.read(buffer)) != -1)
                    fout.write(buffer, 0, count);
            } finally
            {
                fout.close();
            }

            // if time should be restored as well
            long time = ze.getTime();
            if (time > 0)
                file.setLastModified(time);
        }
    } finally
    {
        zis.close();
    }
}

3
public class MainActivity extends Activity {

private String LOG_TAG = MainActivity.class.getSimpleName();

private File zipFile;
private File destination;

private TextView status;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    status = (TextView) findViewById(R.id.main_status);
    status.setGravity(Gravity.CENTER);

    if ( initialize() ) {
        zipFile = new File(destination, "BlueBoxnew.zip");
        try {
            Unzipper.unzip(zipFile, destination);
            status.setText("Extracted to \n"+destination.getAbsolutePath());
        } catch (ZipException e) {
            Log.e(LOG_TAG, e.getMessage());
        } catch (IOException e) {
            Log.e(LOG_TAG, e.getMessage());
        }
    } else {
        status.setText("Unable to initialize sd card.");
    }
}

public boolean initialize() {
    boolean result = false;
     File sdCard = new File(Environment.getExternalStorageDirectory()+"/zip/");
    //File sdCard = Environment.getExternalStorageDirectory();
    if ( sdCard != null ) {
        destination = sdCard;
        if ( !destination.exists() ) {
            if ( destination.mkdir() ) {
                result = true;
            }
        } else {
            result = true;
        }
    }

    return result;
}

 }

-> সহায়ক শ্রেণি (আনজিপার.জভা)

    import java.io.File;
    import java.io.FileInputStream;
   import java.io.FileOutputStream;
    import java.io.IOException;
       import java.util.zip.ZipEntry;
    import java.util.zip.ZipException;
    import java.util.zip.ZipInputStream;
     import android.util.Log;

   public class Unzipper {

private static String LOG_TAG = Unzipper.class.getSimpleName();

public static void unzip(final File file, final File destination) throws ZipException, IOException {
    new Thread() {
        public void run() {
            long START_TIME = System.currentTimeMillis();
            long FINISH_TIME = 0;
            long ELAPSED_TIME = 0;
            try {
                ZipInputStream zin = new ZipInputStream(new FileInputStream(file));
                String workingDir = destination.getAbsolutePath()+"/";

                byte buffer[] = new byte[4096];
                int bytesRead;
                ZipEntry entry = null;
                while ((entry = zin.getNextEntry()) != null) {
                    if (entry.isDirectory()) {
                        File dir = new File(workingDir, entry.getName());
                        if (!dir.exists()) {
                            dir.mkdir();
                        }
                        Log.i(LOG_TAG, "[DIR] "+entry.getName());
                    } else {
                        FileOutputStream fos = new FileOutputStream(workingDir + entry.getName());
                        while ((bytesRead = zin.read(buffer)) != -1) {
                            fos.write(buffer, 0, bytesRead);
                        }
                        fos.close();
                        Log.i(LOG_TAG, "[FILE] "+entry.getName());
                    }
                }
                zin.close();

                FINISH_TIME = System.currentTimeMillis();
                ELAPSED_TIME = FINISH_TIME - START_TIME;
                Log.i(LOG_TAG, "COMPLETED in "+(ELAPSED_TIME/1000)+" seconds.");
            } catch (Exception e) {
                Log.e(LOG_TAG, "FAILED");
            }
        };
    }.start();
}

   }

-> এক্সএমএল লেআউট (কার্যকলাপ_মাইন.এক্সএমএল):

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
   xmlns:tools="http://schemas.android.com/tools"
   android:layout_width="match_parent"
 android:layout_height="match_parent"
 tools:context=".MainActivity" >

<TextView
    android:id="@+id/main_status"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_centerHorizontal="true"
    android:layout_centerVertical="true"
    android:text="@string/hello_world" />

</RelativeLayout>

-> ম্যানিফেস্ট ফাইলে অনুমতি:

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>

2

এখানে একটি জিপফিলিএটরেটর রয়েছে (জাভা আইট্রেটারের মতো, তবে জিপ ফাইলগুলির জন্য):

package ch.epfl.bbp.io;

import java.io.BufferedInputStream;
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.util.Iterator;
import java.util.zip.ZipEntry;
import java.util.zip.ZipInputStream;

public class ZipFileIterator implements Iterator<File> {

    private byte[] buffer = new byte[1024];

    private FileInputStream is;
    private ZipInputStream zis;
    private ZipEntry ze;

    public ZipFileIterator(File file) throws FileNotFoundException {
    is = new FileInputStream(file);
    zis = new ZipInputStream(new BufferedInputStream(is));
    }

    @Override
    public boolean hasNext() {
    try {
        return (ze = zis.getNextEntry()) != null;
    } catch (IOException e) {
        e.printStackTrace();
    }
    return false;
    }

    @Override
    public File next() {
    try {
        ByteArrayOutputStream baos = new ByteArrayOutputStream();
        int count;

        String filename = ze.getName();
        File tmpFile = File.createTempFile(filename, "tmp");
        tmpFile.deleteOnExit();// TODO make it configurable
        FileOutputStream fout = new FileOutputStream(tmpFile);

        while ((count = zis.read(buffer)) != -1) {
        baos.write(buffer, 0, count);
        byte[] bytes = baos.toByteArray();
        fout.write(bytes);
        baos.reset();
        }
        fout.close();
        zis.closeEntry();

        return tmpFile;

    } catch (Exception e) {
        throw new RuntimeException(e);
    }
    }

    @Override
    public void remove() {
    throw new RuntimeException("not implemented");
    }

    public void close() {
    try {
        zis.close();
        is.close();
    } catch (IOException e) {// nope
    }
    }
}

আপনি কি ভাবেন যে একই কোডটি এক্সপেনশন এপিপি এক্সপেনশন ফাইলগুলি ওবিপি ফাইল আনজিপিং বা আনপ্যাক করার জন্য কাজ করে?
LOG_TAG

2

সর্বনিম্ন উদাহরণ আমি আমার জিপ ফাইল থেকে আমার অ্যাপ্লিকেশন ক্যাশে ফোল্ডারে একটি নির্দিষ্ট ফাইল আনজিপ করতে ব্যবহার করি। আমি তখন ভিন্ন পদ্ধতি ব্যবহার করে ম্যানিফেস্ট ফাইলটি পড়ি।

private void unzipUpdateToCache() {
    ZipInputStream zipIs = new ZipInputStream(context.getResources().openRawResource(R.raw.update));
    ZipEntry ze = null;

    try {

        while ((ze = zipIs.getNextEntry()) != null) {
            if (ze.getName().equals("update/manifest.json")) {
                FileOutputStream fout = new FileOutputStream(context.getCacheDir().getAbsolutePath() + "/manifest.json");

                byte[] buffer = new byte[1024];
                int length = 0;

                while ((length = zipIs.read(buffer))>0) {
                    fout.write(buffer, 0, length);
                }
                zipIs .closeEntry();
                fout.close();
            }
        }
        zipIs .close();

    } catch (IOException e) {
        e.printStackTrace();
    }

}

2

আমি জিপ ফাইলগুলির সাথে কাজ করছি যা জাভা এর জিপফিল শ্রেণি পরিচালনা করতে সক্ষম নয়। জাভা 8 স্পষ্টতই সংকোচনের পদ্ধতি পরিচালনা করতে পারে না 12 (আমার বিশ্বাস bzip2)। জিপ 4 জে (যা অন্য কোনও সমস্যার কারণে এই নির্দিষ্ট ফাইলগুলির সাথেও ব্যর্থ হয়) সহ বেশ কয়েকটি পদ্ধতির চেষ্টা করার পরে, আমি অ্যাপাচে কমন্স- সংক্ষেপে সাফল্য পেয়েছি যা এখানে উল্লিখিত হিসাবে অতিরিক্ত সংকোচনের পদ্ধতি সমর্থন করে ।

নোট করুন যে নীচের জিপফিল ক্লাসটি java.util.zip থেকে নেই।

এটি আসলে org.apache.commons.compress.archivers.zip.ZipFile তাই আমদানি সম্পর্কে সতর্ক থাকুন।

try (ZipFile zipFile = new ZipFile(archiveFile)) {
    Enumeration<ZipArchiveEntry> entries = zipFile.getEntries();
    while (entries.hasMoreElements()) {
        ZipArchiveEntry entry = entries.nextElement();
        File entryDestination = new File(destination, entry.getName());
        if (entry.isDirectory()) {
            entryDestination.mkdirs();
        } else {
            entryDestination.getParentFile().mkdirs();
            try (InputStream in = zipFile.getInputStream(entry); OutputStream out = new FileOutputStream(entryDestination)) {
                IOUtils.copy(in, out);
            }
        }
    }
} catch (IOException ex) {
    log.debug("Error unzipping archive file: " + archiveFile, ex);
}

গ্রেডলের জন্য:

compile 'org.apache.commons:commons-compress:1.18'

2

জাফলের উত্তরের ভিত্তিতে, try()প্রায় যোগ করার Closeableপরে ব্যবহারের পরে স্বয়ংক্রিয়ভাবে স্ট্রিমগুলি বন্ধ হয়ে যায়।

public static void unzip(File zipFile, File targetDirectory) {
    try (FileInputStream fis = new FileInputStream(zipFile)) {
        try (BufferedInputStream bis = new BufferedInputStream(fis)) {
            try (ZipInputStream zis = new ZipInputStream(bis)) {
                ZipEntry ze;
                int count;
                byte[] buffer = new byte[Constant.DefaultBufferSize];
                while ((ze = zis.getNextEntry()) != null) {
                    File file = new File(targetDirectory, ze.getName());
                    File dir = ze.isDirectory() ? file : file.getParentFile();
                    if (!dir.isDirectory() && !dir.mkdirs())
                        throw new FileNotFoundException("Failed to ensure directory: " + dir.getAbsolutePath());
                    if (ze.isDirectory())
                        continue;
                    try (FileOutputStream fout = new FileOutputStream(file)) {
                        while ((count = zis.read(buffer)) != -1)
                            fout.write(buffer, 0, count);
                    }
                }
            }
        }
    } catch (Exception ex) {
        //handle exception
    }
}

জন স্কিটির উত্তর থেকে স্ট্রিম.কপিটিও থেকে প্রাপ্ত Constant.DefaultBufferSize( 65536) ব্যবহার করুন: C# .NET 4 https://stackoverflow.com/a/411605/1876355

আমি সবসময় শুধু ব্যবহার করে পোস্টগুলি দেখতে পাই byte[1024]বাbyte[4096] ব্যাফার , কখনও জানতাম না যে এটি আরও বড় হতে পারে যা কার্য সম্পাদনকে উন্নত করে এবং এখনও পুরোপুরি স্বাভাবিকভাবে কাজ করে।

Streamসোর্স কোডটি এখানে : https : //references Source.microsoft.com/#mscorlib/system/io/stream.cs

//We pick a value that is the largest multiple of 4096 that is still smaller than the large object heap threshold (85K).
// The CopyTo/CopyToAsync buffer is short-lived and is likely to be collected at Gen0, and it offers a significant
// improvement in Copy performance.

private const int _DefaultCopyBufferSize = 81920;

তবে, আমি এটিকে ডায়াল করেছিলাম 65536যা 4096নিরাপদ থাকার জন্যও একাধিক ।


1
এটি এই থ্রেডে সেরা সমাধান। এছাড়াও, আমি ফাইলআউটপুট স্ট্রিমের সাথে স্ট্যাকে বাফারআউটপুট স্ট্রিম ব্যবহার করব।
মার্কোআর

1

পাসওয়ার্ড সুরক্ষিত জিপ ফাইল

আপনি যদি পাসওয়ার্ড সহ ফাইলগুলি সংকুচিত করতে চান তবে আপনি এই লাইব্রেরিটি একবার দেখে নিতে পারেন দেখতে পারেন যা পাসওয়ার্ড সহ ফাইলগুলি সহজে জিপ করতে পারে:

জিপ:

ZipArchive zipArchive = new ZipArchive();
zipArchive.zip(targetPath,destinationPath,password);

আনজিপ:

ZipArchive zipArchive = new ZipArchive();
zipArchive.unzip(targetPath,destinationPath,password);

রার:

RarArchive rarArchive = new RarArchive();
rarArchive.extractArchive(file archive, file destination);

এই লাইব্রেরির ডকুমেন্টেশন যথেষ্ট ভাল, আমি সেখান থেকে কয়েকটি উদাহরণ যুক্ত করেছি। এটি সম্পূর্ণ বিনামূল্যে এবং অ্যান্ড্রয়েডের জন্য বিশেষভাবে লিখেছেন।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.