2009-03-14 36 views
22

có hỗ trợ tích hợp trong Groovy để xử lý các tệp Zip (theo cách hấp dẫn) không?Giải nén Lưu trữ với Groovy

Hoặc tôi có phải sử dụng java.util.zip.ZipFile của Java để xử lý tệp Zip trong Groovy không?

+0

Đây có phải là câu hỏi/câu trả lời hợp lệ không? Phiên bản Groovy này cũng đề cập đến điều gì? – serverhorror

Trả lời

6

AFAIK, không có cách nào riêng. Nhưng hãy xem this article về cách bạn thêm phương thức .zip(...) vào Tệp, điều này rất gần với những gì bạn đang tìm kiếm. Bạn chỉ cần thực hiện phương thức .unzip(...).

+0

Thật không may, bài viết đó đã biến mất khỏi blog. May mắn thay [có một phiên bản lưu trữ] (https://web.archive.org/web/20151120062929/http://blog.xebia.com/2008/05/25/powerful-groovy/). Nhưng bài viết [More Groovy Power] (http://blog.xebia.com/more-groovy-power/) cũng tốt. – Jazzschmidt

43

Có thể Groovy không có hỗ trợ 'gốc' cho các tệp zip, nhưng nó vẫn khá tầm thường để làm việc với chúng.

Tôi đang làm việc với các tập tin zip và sau đây là một số logic Tôi đang sử dụng:

def zipFile = new java.util.zip.ZipFile(new File('some.zip')) 

zipFile.entries().each { 
    println zipFile.getInputStream(it).text 
} 

Bạn có thể thêm logic bổ sung sử dụng một phương pháp findAll:

def zipFile = new java.util.zip.ZipFile(new File('some.zip')) 

zipFile.entries().findAll { !it.directory }.each { 
    println zipFile.getInputStream(it).text 
} 
+0

+1 để nhắc tôi rằng bản thu nhỏ của groovy đã thay thế tất cả các đĩa lò xử lý luồng truyền thống của java. –

34

Trong tôi kinh nghiệm, cách tốt nhất để làm điều này là sử dụng Antbuilder:

def ant = new AntBuilder() // create an antbuilder 

ant.unzip( src:"your-src.zip", 
      dest:"your-dest-directory", 
      overwrite:"false") 

Bằng cách này bạn không chịu trách nhiệm làm tất cả những thứ phức tạp - kiến ​​sẽ chăm sóc nó cho bạn. Rõ ràng nếu bạn cần một cái gì đó chi tiết hơn thì điều này sẽ không hoạt động, nhưng đối với hầu hết các kịch bản 'chỉ giải nén tập tin này' thì điều này thực sự hiệu quả.

Để sử dụng trình chặn, chỉ cần bao gồm ant.jar và ant-launcher.jar trong đường dẫn lớp của bạn.

+0

@ {Kirk G}. Bạn có biết nếu theo cách tiếp cận này, có thể làm cho AntBuider yên lặng (không xuất ra màn hình) không? –

+0

làm thế nào để bạn sử dụng các mẫu ở đây? làm thế nào để giải nén tập tin chọn lọc? –

+0

Lưu ý rằng ant.unzip là một trình bao bọc đơn giản xung quanh tác vụ giải nén kiến ​​hiện có. Các thông số bạn cung cấp chỉ đơn giản là được truyền trực tiếp. Xem https://ant.apache.org/manual/Tasks/unzip.html để biết thêm thông tin. –

1

Bài viết này mở rộng trên ví dụ về AntBuilder.

http://preferisco.blogspot.com/2010/06/using-goovy-antbuilder-to-zip-unzip.html

Tuy nhiên, như một vấn đề gốc - là có một cách để tìm ra tất cả các tài sản, đóng cửa, bản đồ vv có thể được sử dụng khi nghiên cứu một khía cạnh mới trong groovy/java? Dường như có vô số thứ thực sự hữu ích, nhưng làm sao để mở kho báu ẩn của họ? Các tính năng hoàn chỉnh mã của NetBeans/Eclipse giờ đây dường như bị giới hạn vô hạn trong sự phong phú ngôn ngữ mới mà chúng ta có ở đây.

-2
def zip(String s){ 
    def targetStream = new ByteArrayOutputStream() 
    def zipStream = new GZIPOutputStream(targetStream) 
    zipStream.write(s.getBytes()) 
    zipStream.close() 
    def zipped = targetStream.toByteArray() 
    targetStream.close() 
    return zipped.encodeBase64() 
} 
0

Giải nén bằng AntBuilder là cách tốt.
tùy chọn thứ hai là sử dụng một thư viện của bên thứ ba - Tôi khuyên bạn nên Zip4j

0

Mặc dù lấy câu hỏi một chút sang hướng khác, tôi bắt đầu sử dụng Groovy cho DSL mà tôi đang xây dựng, nhưng cuối cùng sử dụng Gradle làm điểm khởi đầu để xử lý tốt hơn nhiều tác vụ dựa trên tệp mà tôi muốn thực hiện (ví dụ: giải nén và bỏ tệp, thực thi các chương trình khác, v.v.) . Gradle xây dựng trên những gì groovy có thể làm, và có thể được mở rộng hơn nữa thông qua các plugin.

// build.gradle 
task doUnTar << { 
    copy { 
     // tarTree uses file ext to guess compression, or may be specific 
     from tarTree(resources.gzip('foo.tar.gz')) 
     into getBuildDir() 
    } 
} 

task doUnZip << { 
    copy { 
     from zipTree('bar.zip') 
     into getBuildDir() 
    } 
} 

Sau đó, ví dụ (điều này chiết xuất bar.zipfoo.tgz vào thư mục build):

$ gradle doUnZip 
$ gradle doUnTar 
0

dưới đây phương pháp hấp dẫn sẽ giải nén vào thư mục cụ thể (C: \ thư mục). Hi vọng điêu nay co ich.

import org.apache.commons.io.FileUtils 
import java.nio.file.Files 
import java.nio.file.Paths 
import java.util.zip.ZipFile 

def unzipFile(File file) { 
    cleanupFolder() 
    def zipFile = new ZipFile(file) 
    zipFile.entries().each { it -> 
     def path = Paths.get('c:\\folder\\' + it.name) 
     if(it.directory){ 
      Files.createDirectories(path) 
     } 
     else { 
      def parentDir = path.getParent() 
      if (!Files.exists(parentDir)) { 
       Files.createDirectories(parentDir) 
      } 
      Files.copy(zipFile.getInputStream(it), path) 
     } 
    } 
} 

private cleanupFolder() { 
    FileUtils.deleteDirectory(new File('c:\\folder\\')) 
} 
Các vấn đề liên quan