জাভাতে কীভাবে জিপ ফাইল তৈরি করবেন


149

আমার কাছে একটি গতিশীল পাঠ্য ফাইল রয়েছে যা ব্যবহারকারীর ক্যোয়ারী অনুসারে একটি ডাটাবেস থেকে সামগ্রী বাছাই করে। আমাকে এই বিষয়বস্তুকে একটি পাঠ্য ফাইলে লিখতে হবে এবং একটি সার্লেটের কোনও ফোল্ডারে জিপ করতে হবে। আমি এই কিভাবে করা উচিত?

উত্তর:


231

এই উদাহরণটি দেখুন:

StringBuilder sb = new StringBuilder();
sb.append("Test String");

File f = new File("d:\\test.zip");
ZipOutputStream out = new ZipOutputStream(new FileOutputStream(f));
ZipEntry e = new ZipEntry("mytext.txt");
out.putNextEntry(e);

byte[] data = sb.toString().getBytes();
out.write(data, 0, data.length);
out.closeEntry();

out.close();

এটি D:নামের মূলটিতে একটি জিপ তৈরি করবে test.zipযার মধ্যে একটি একক ফাইল নামক ফাইল থাকবে mytext.txt। অবশ্যই আপনি আরও জিপ এন্ট্রি যুক্ত করতে পারেন এবং এর মতো একটি সাব-ডিরেক্টরিকেও নির্দিষ্ট করতে পারেন:

ZipEntry e = new ZipEntry("folderName/mytext.txt");

আপনি এখানে জাভা দিয়ে সংক্ষেপণ সম্পর্কে আরও তথ্য পেতে পারেন ।


1
দুটি লাইন কেন: byte[] data = sb.toString().getBytes(); out.write(data, 0, data.length);এই কোড নমুনায় অন্তর্ভুক্ত? তাদের উদ্দেশ্য কী?
কাডজিয়া

@kdzia, প্রথম লাইনটি স্ট্রিংবিল্ডার মানকে একটি বাইট অ্যারে রূপান্তর করে এবং দ্বিতীয় লাইন সেই বাইট অ্যারে নেয় এবং এটি "টেস্ট.জাইপ" ফাইলের মধ্যে জিপেন্ট্রিতে লিখে দেয়। এই লাইনগুলি প্রয়োজনীয় কারণ জিপ ফাইলগুলি স্ট্রিং নয়, বাইট অ্যারে দিয়ে কাজ করে।
অরেঞ্জডোমব্যাট

3
তবে ... উপরের উদাহরণে স্ট্রিংবিল্ডারের কীভাবে "টেস্ট স্ট্রিং" ব্যতীত অন্য কিছু থাকতে পারে? আমিও এতে কিছুটা বিভ্রান্ত। আপনি যদি sb.toString().getBytes()জিপ ফাইলটিতে লিখতে থাকেন তবে আমি আশা করব যে আপনি এটি যে ফাইলটি জিপ করছেন তার বাইটটি এটি ধারণ করতে চান? নাকি আমি কিছু মিস করছি?
রবিএ

3
@ রবা আপনি কিছু মিস করছেন না স্ট্রিংবিল্ডার আসলে ওপি তার ডাটাবেস থেকে প্রাপ্ত পাঠ্যটি বোঝায়। ওপি কেবল getTextFromDatabase () ভালো কিছু করার জন্য "টেস্ট STRING" (উদ্ধৃতি সহ) প্রতিস্থাপন করতে হবে
Blueriver

ধন্যবাদ, @ ব্লুয়ারইভার
রবিএ

143

জাভা 7-এ জিপফাইলে সিস্টেমটি অন্তর্নির্মিত রয়েছে, এটি জিপ ফাইল থেকে ফাইল তৈরি করতে, লিখতে এবং পড়তে ব্যবহার করা যেতে পারে।

জাভা ডক: জিপফাইলে সিস্টেম সরবরাহকারী

Map<String, String> env = new HashMap<>();
// Create the zip file if it doesn't exist
env.put("create", "true");

URI uri = URI.create("jar:file:/codeSamples/zipfs/zipfstest.zip");

try (FileSystem zipfs = FileSystems.newFileSystem(uri, env)) {
    Path externalTxtFile = Paths.get("/codeSamples/zipfs/SomeTextFile.txt");
    Path pathInZipfile = zipfs.getPath("/SomeTextFile.txt");          
    // Copy a file into the zip file
    Files.copy(externalTxtFile, pathInZipfile, StandardCopyOption.REPLACE_EXISTING); 
}

1
এক্সটেনশন না হলে এই কাজ করার কোনও উপায় আছে কি .zip? আমার একটি .fooফাইল লিখতে হবে যা জিপ ফাইলের মতো হুবহু ফর্ম্যাট করা হলেও আলাদা এক্সটেনশন সহ। আমি জানি আমি একটি .zipফাইল তৈরি করতে পারি এবং এটির নতুন নামকরণ করতে পারি তবে সঠিক নাম দিয়ে এটিকে তৈরি করা সহজতর হবে।
ট্রয় ড্যানিয়েলস

2
@ ট্রয়ডানিয়েলস উপরের উদাহরণটি বিভিন্ন এক্সটেনশনের সাথেও কাজ করে, যেহেতু এটি jar:file:ইউআরআই তৈরি করতে উপসর্গ ব্যবহার করে ।
শিভালন

10
এখানে উপস্থিত হতে পারে কেবলমাত্র ইস্যুটি আপনার ডিরেক্টরি আছে এটি কাজ করবে না। সুতরাং, উদাহরণস্বরূপ, আপনার যদি pathInZipfileভেরিয়েবলে "/dir/SomeTextFile.txt" থাকে তবে আপনার .zip সংরক্ষণাগারটির ভিতরে 'dir' তৈরি করতে হবে। এটির জন্য, কেবল পরবর্তী পংক্তিটি যুক্ত করুন: পদ্ধতি Files.createDirectories(pathInZipfile.getParent())চালনার আগে Files.copy
ডি নওমোভিচ

কম্প্রেশন স্তর কিভাবে সেট করবেন?
সিডালেক্সান্ডার

34

একটি জিপ ফাইল লিখতে, আপনি একটি জিপআউটপুট স্ট্রিম ব্যবহার করেন। আপনি জিপ ফাইলটিতে রাখতে চান এমন প্রতিটি প্রবেশের জন্য আপনি একটি জিপইন্ট্রি অবজেক্ট তৈরি করেন। আপনি ফাইলের নাম জিপইন্ট্রি কনস্ট্রাক্টরকে দিয়ে দিন; এটি অন্যান্য পরামিতি যেমন ফাইলের তারিখ এবং ডিকম্প্রেশন পদ্ধতি সেট করে। আপনি যদি চান তবে এই সেটিংসকে ওভাররাইড করতে পারেন। তারপরে, আপনি একটি নতুন ফাইল লেখার জন্য জিপআউটপুট স্ট্রিমের putNextEntry পদ্ধতিতে কল করেন। জিপ স্ট্রিমিতে ফাইলের ডেটা প্রেরণ করুন। আপনার কাজ শেষ হয়ে গেলে ক্লোজএন্ট্রি কল করুন। আপনি যে সমস্ত ফাইল সঞ্চয় করতে চান তার পুনরাবৃত্তি করুন। এখানে একটি কোড কঙ্কাল রয়েছে:

FileOutputStream fout = new FileOutputStream("test.zip");
ZipOutputStream zout = new ZipOutputStream(fout);
for all files
{
    ZipEntry ze = new ZipEntry(filename);
    zout.putNextEntry(ze);
    send data to zout;
    zout.closeEntry();
}
zout.close();

22

পুরো ডিরেক্টরিটি (সাব ফাইল এবং সাব ডিরেক্টরি সহ) সংকুচিত করার জন্য এখানে একটি উদাহরণ কোড দেওয়া হয়েছে , এটি জাভা এনআইওর ওয়াক ফাইল ট্রি ট্রিচার ব্যবহার করে।

import java.io.FileOutputStream;
import java.io.IOException;
import java.nio.file.*;
import java.nio.file.attribute.BasicFileAttributes;
import java.util.zip.ZipEntry;
import java.util.zip.ZipOutputStream;

public class ZipCompress {
    public static void compress(String dirPath) {
        final Path sourceDir = Paths.get(dirPath);
        String zipFileName = dirPath.concat(".zip");
        try {
            final ZipOutputStream outputStream = new ZipOutputStream(new FileOutputStream(zipFileName));
            Files.walkFileTree(sourceDir, new SimpleFileVisitor<Path>() {
                @Override
                public FileVisitResult visitFile(Path file, BasicFileAttributes attributes) {
                    try {
                        Path targetFile = sourceDir.relativize(file);
                        outputStream.putNextEntry(new ZipEntry(targetFile.toString()));
                        byte[] bytes = Files.readAllBytes(file);
                        outputStream.write(bytes, 0, bytes.length);
                        outputStream.closeEntry();
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                    return FileVisitResult.CONTINUE;
                }
            });
            outputStream.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

এটি ব্যবহার করতে, কেবল কল করুন

ZipCompress.compress("target/directoryToCompress");

এবং আপনি একটি জিপ ফাইল ডিরেক্টরি টোকোমপ্রেস.জিপ পাবেন


4

স্প্রিং বুট নিয়ামক, ডিরেক্টরিগুলিতে ফাইলগুলি জিপ করুন এবং ডাউনলোড করা যায় can

@RequestMapping(value = "/files.zip")
@ResponseBody
byte[] filesZip() throws IOException {
    File dir = new File("./");
    File[] filesArray = dir.listFiles();
    if (filesArray == null || filesArray.length == 0)
        System.out.println(dir.getAbsolutePath() + " have no file!");
    ByteArrayOutputStream bo = new ByteArrayOutputStream();
    ZipOutputStream zipOut= new ZipOutputStream(bo);
    for(File xlsFile:filesArray){
        if(!xlsFile.isFile())continue;
        ZipEntry zipEntry = new ZipEntry(xlsFile.getName());
        zipOut.putNextEntry(zipEntry);
        zipOut.write(IOUtils.toByteArray(new FileInputStream(xlsFile)));
        zipOut.closeEntry();
    }
    zipOut.close();
    return bo.toByteArray();
}

2
public static void main(String args[])
{
    omtZip("res/", "omt.zip");
}
public static void omtZip(String path,String outputFile)
{
    final int BUFFER = 2048;
    boolean isEntry = false;
    ArrayList<String> directoryList = new ArrayList<String>();
    File f = new File(path);
    if(f.exists())
    {
    try {
            FileOutputStream fos = new FileOutputStream(outputFile);
            ZipOutputStream zos = new ZipOutputStream(new BufferedOutputStream(fos));
            byte data[] = new byte[BUFFER];

            if(f.isDirectory())
            {
               //This is Directory
                do{
                    String directoryName = "";
                    if(directoryList.size() > 0)
                    {
                        directoryName = directoryList.get(0);
                        System.out.println("Directory Name At 0 :"+directoryName);
                    }
                    String fullPath = path+directoryName;
                    File fileList = null;
                    if(directoryList.size() == 0)
                    {
                        //Main path (Root Directory)
                        fileList = f;
                    }else
                    {
                        //Child Directory
                        fileList = new File(fullPath);
                    }
                    String[] filesName = fileList.list();

                    int totalFiles = filesName.length;
                    for(int i = 0 ; i < totalFiles ; i++)
                    {
                        String name = filesName[i];
                        File filesOrDir = new File(fullPath+name);
                        if(filesOrDir.isDirectory())
                        {
                            System.out.println("New Directory Entry :"+directoryName+name+"/");
                            ZipEntry entry = new ZipEntry(directoryName+name+"/");
                            zos.putNextEntry(entry);
                            isEntry = true;
                            directoryList.add(directoryName+name+"/");
                        }else
                        {
                            System.out.println("New File Entry :"+directoryName+name);
                            ZipEntry entry = new ZipEntry(directoryName+name);
                            zos.putNextEntry(entry);
                            isEntry = true;
                            FileInputStream fileInputStream = new FileInputStream(filesOrDir);
                            BufferedInputStream bufferedInputStream = new BufferedInputStream(fileInputStream, BUFFER);
                            int size = -1;
                            while(  (size = bufferedInputStream.read(data, 0, BUFFER)) != -1  )
                            {
                                zos.write(data, 0, size);
                            }
                            bufferedInputStream.close();
                        }
                    }
                    if(directoryList.size() > 0 && directoryName.trim().length() > 0)
                    {
                        System.out.println("Directory removed :"+directoryName);
                        directoryList.remove(0);
                    }

                }while(directoryList.size() > 0);
            }else
            {
                //This is File
                //Zip this file
                System.out.println("Zip this file :"+f.getPath());
                FileInputStream fis = new FileInputStream(f);
                BufferedInputStream bis = new BufferedInputStream(fis,BUFFER);
                ZipEntry entry = new ZipEntry(f.getName());
                zos.putNextEntry(entry);
                isEntry = true;
                int size = -1 ;
                while(( size = bis.read(data,0,BUFFER)) != -1)
                {
                    zos.write(data, 0, size);
                }
            }               

            //CHECK IS THERE ANY ENTRY IN ZIP ? ----START
            if(isEntry)
            {
              zos.close();
            }else
            {
                zos = null;
                System.out.println("No Entry Found in Zip");
            }
            //CHECK IS THERE ANY ENTRY IN ZIP ? ----START
        }catch(Exception e)
        {
            e.printStackTrace();
        }
    }else
    {
        System.out.println("File or Directory not found");
    }
 }    

}

2

আপনি উত্স ফাইল থেকে এইভাবে একটি জিপ ফাইল তৈরি করেন:

String srcFilename = "C:/myfile.txt";
String zipFile = "C:/myfile.zip";

try {
    byte[] buffer = new byte[1024];
    FileOutputStream fos = new FileOutputStream(zipFile);
    ZipOutputStream zos = new ZipOutputStream(fos);         
    File srcFile = new File(srcFilename);
    FileInputStream fis = new FileInputStream(srcFile);
    zos.putNextEntry(new ZipEntry(srcFile.getName()));          
    int length;
    while ((length = fis.read(buffer)) > 0) {
        zos.write(buffer, 0, length);
    }
    zos.closeEntry();
    fis.close();
    zos.close();            
}
catch (IOException ioe) {
    System.out.println("Error creating zip file" + ioe);
}

1

ফাইল:

String filePath = "/absolute/path/file1.txt";
String zipPath = "/absolute/path/output.zip";

try (ZipOutputStream zipOut = new ZipOutputStream(new FileOutputStream(zipPath))) {
    File fileToZip = new File(filePath);
    zipOut.putNextEntry(new ZipEntry(fileToZip.getName()));
    Files.copy(fileToZip.toPath(), zipOut);
}

একাধিক ফাইল:

List<String> filePaths = Arrays.asList("/absolute/path/file1.txt", "/absolute/path/file2.txt");
String zipPath = "/absolute/path/output.zip";

try (ZipOutputStream zipOut = new ZipOutputStream(new FileOutputStream(zipPath))) {
    for (String filePath : filePaths) {
        File fileToZip = new File(filePath);
        zipOut.putNextEntry(new ZipEntry(fileToZip.getName()));
        Files.copy(fileToZip.toPath(), zipOut);
    }
}

1

আপনার প্রধানত দুটি ফাংশন তৈরি করতে হবে। প্রথমটি রাইটটোজিপ ফাইল () এবং দ্বিতীয়টি ক্রিয়েটজিপ ফাইলেরফুটআউটপুট .... এবং তারপরে ক্রিয়েটজিপ ফাইলেরফুটআউটপুটকে ('জিপ ফাইলের নাম') কল করুন `…

 public static void writeToZipFile(String path, ZipOutputStream zipStream)
        throws FileNotFoundException, IOException {

    System.out.println("Writing file : '" + path + "' to zip file");

    File aFile = new File(path);
    FileInputStream fis = new FileInputStream(aFile);
    ZipEntry zipEntry = new ZipEntry(path);
    zipStream.putNextEntry(zipEntry);

    byte[] bytes = new byte[1024];
    int length;
    while ((length = fis.read(bytes)) >= 0) {
        zipStream.write(bytes, 0, length);
    }

    zipStream.closeEntry();
    fis.close();
}

public static void createZipfileForOutPut(String filename) {
    String home = System.getProperty("user.home");
   // File directory = new File(home + "/Documents/" + "AutomationReport");
    File directory = new File("AutomationReport");
    if (!directory.exists()) {
        directory.mkdir();
    }
    try {
        FileOutputStream fos = new FileOutputStream("Path to your destination" + filename + ".zip");
        ZipOutputStream zos = new ZipOutputStream(fos);

        writeToZipFile("Path to file which you want to compress / zip", zos);


        zos.close();
        fos.close();
    } catch (FileNotFoundException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    }
}

0

আপনি যদি সফ্টওয়্যার ছাড়াই ডিকম্প্রেস করতে চান তবে এই কোডটি ব্যবহার করুন। পিডিএফ ফাইল সহ অন্যান্য কোড ম্যানুয়ালি সংক্ষেপে ত্রুটি প্রেরণ করে

byte[] buffer = new byte[1024];     
    try
    {   
        FileOutputStream fos = new FileOutputStream("123.zip");
        ZipOutputStream zos = new ZipOutputStream(fos);
        ZipEntry ze= new ZipEntry("file.pdf");
        zos.putNextEntry(ze);
        FileInputStream in = new FileInputStream("file.pdf");
        int len;
        while ((len = in.read(buffer)) > 0) 
        {
            zos.write(buffer, 0, len);
        }
        in.close();
        zos.closeEntry();
        zos.close();
    }
    catch(IOException ex)
    {
       ex.printStackTrace();
    }

0

যেহেতু এটি নির্ধারণ করতে আমার কিছুটা সময় লেগেছে, তাই আমি ভেবেছিলাম জাভা 7+ জিপফাইস সিস্টেম ব্যবহার করে আমার সমাধান পোস্ট করা সহায়ক হবে

 openZip(runFile);

 addToZip(filepath); //loop construct;  

 zipfs.close();

 private void openZip(File runFile) throws IOException {
    Map<String, String> env = new HashMap<>();
    env.put("create", "true");
    env.put("encoding", "UTF-8");
    Files.deleteIfExists(runFile.toPath());
    zipfs = FileSystems.newFileSystem(URI.create("jar:" + runFile.toURI().toString()), env);    
 }

 private void addToZip(String filename) throws IOException {
    Path externalTxtFile = Paths.get(filename).toAbsolutePath();
    Path pathInZipfile = zipfs.getPath(filename.substring(filename.lastIndexOf("results"))); //all files to be stored have a common base folder, results/ in my case
    if (Files.isDirectory(externalTxtFile)) {
        Files.createDirectories(pathInZipfile);
        try (DirectoryStream<Path> ds = Files.newDirectoryStream(externalTxtFile)) {
            for (Path child : ds) {
                addToZip(child.normalize().toString()); //recursive call
            }
        }
    } else {
        // copy file to zip file
        Files.copy(externalTxtFile, pathInZipfile, StandardCopyOption.REPLACE_EXISTING);            
    }
 }

0
public static void zipFromTxt(String zipFilePath, String txtFilePath) {
    Assert.notNull(zipFilePath, "Zip file path is required");
    Assert.notNull(txtFilePath, "Txt file path is required");
    zipFromTxt(new File(zipFilePath), new File(txtFilePath));
}

public static void zipFromTxt(File zipFile, File txtFile) {
    ZipOutputStream out = null;
    FileInputStream in = null;
    try {
        Assert.notNull(zipFile, "Zip file is required");
        Assert.notNull(txtFile, "Txt file is required");
        out = new ZipOutputStream(new FileOutputStream(zipFile));
        in = new FileInputStream(txtFile);
        out.putNextEntry(new ZipEntry(txtFile.getName()));
        int len;
        byte[] buffer = new byte[1024];
        while ((len = in.read(buffer)) > 0) {
            out.write(buffer, 0, len);
            out.flush();
        }
    } catch (Exception e) {
        log.info("Zip from txt occur error,Detail message:{}", e.toString());
    } finally {
        try {
            if (in != null) in.close();
            if (out != null) {
                out.closeEntry();
                out.close();
            }
        } catch (Exception e) {
            log.info("Zip from txt close error,Detail message:{}", e.toString());
        }
    }
}

0

স্ট্রিং ভেরিয়েবলগুলি দেওয়া exportPathএবং queryResultsহিসাবে, নীচের ব্লকটি results.zipনীচে একটি ফাইল তৈরি করে এবং জিপের অভ্যন্তরে কোনও ফাইলের exportPathলিখিত সামগ্রীটি লিখে ।queryResultsresults.txt

URI uri = URI.create("jar:file:" + exportPath + "/results.zip");
Map<String, String> env = Collections.singletonMap("create", "true");

try (FileSystem zipfs = FileSystems.newFileSystem(uri, env)) {
  Path filePath = zipfs.getPath("/results.txt");
  byte[] fileContent = queryResults.getBytes();

  Files.write(filePath, fileContent, StandardOpenOption.CREATE);
}


0

Https://github.com/srikanth-lingala/zip4jzip4j এ ব্যবহার করে আরও একটি বিকল্প রয়েছে

এতে একক ফাইলের সাথে একটি জিপ ফাইল তৈরি করা / বিদ্যমান জিপতে একক ফাইল যুক্ত করা

new ZipFile("filename.zip").addFile("filename.ext"); অথবা

new ZipFile("filename.zip").addFile(new File("filename.ext"));

একাধিক ফাইলের সাথে একটি জিপ ফাইল তৈরি করা / বিদ্যমান জিপটিতে একাধিক ফাইল যুক্ত করা

new ZipFile("filename.zip").addFiles(Arrays.asList(new File("first_file"), new File("second_file")));

এটিতে একটি ফোল্ডার যুক্ত করে একটি জিপ ফাইল তৈরি করা / বিদ্যমান জিপটিতে একটি ফোল্ডার যুক্ত করে

new ZipFile("filename.zip").addFolder(new File("/user/myuser/folder_to_add"));

স্ট্রিম থেকে একটি জিপ ফাইল তৈরি করা / বিদ্যমান জিপটিতে একটি স্ট্রিম যুক্ত করা new ZipFile("filename.zip").addStream(inputStream, new ZipParameters());

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