2009-05-23 37 views
6

Tôi có 100 tệp .gz mà tôi cần phải loại bỏ. Tôi có một vài câu hỏigiải nén tệp .gz theo lô

a) Tôi đang sử dụng mã được cung cấp tại http://www.roseindia.net/java/beginners/JavaUncompress.shtml để giải nén tệp .gz. Làm việc tốt. Nhiệm vụ: - có cách nào để lấy tên tệp của tệp nén. Tôi biết rằng lớp Zip của Java cho phép liệt kê tệp entery để làm việc. Điều này có thể cho tôi tên tệp, kích thước, vv được lưu trữ trong tệp .zip. Tuy nhiên, chúng ta có cùng cho các tập tin .gz hay không tên tập tin là giống như filename.gz với .gz loại bỏ.

b) là có một cách thanh lịch khác để giải nén tệp .gz bằng cách gọi hàm tiện ích trong mã java. Giống như gọi ứng dụng 7-zip từ lớp java của bạn. Sau đó, tôi không phải lo lắng về luồng đầu vào/đầu ra.

Xin cảm ơn trước. Kapil

Trả lời

9

a) Zip là một định dạng lưu trữ, trong khi gzip thì không.Vì vậy, một iterator mục không có ý nghĩa nhiều trừ khi (ví dụ) các tập tin gz của bạn được nén các tập tin tar. Những gì bạn muốn có thể là:

File outFile = new File(infile.getParent(), infile.getName().replaceAll("\\.gz$", "")); 

b) Bạn chỉ muốn giải nén tệp? Nếu không, bạn có thể ổn với việc sử dụng GZIPInputStream và đọc trực tiếp các tệp, tức là không có giải nén trung gian.

Nhưng ok. Giả sử bạn thực sự chỉ cần muốn giải nén tệp. Nếu có, bạn có thể sử dụng điều này:

public static File unGzip(File infile, boolean deleteGzipfileOnSuccess) throws IOException { 
    GZIPInputStream gin = new GZIPInputStream(new FileInputStream(infile)); 
    FileOutputStream fos = null; 
    try { 
     File outFile = new File(infile.getParent(), infile.getName().replaceAll("\\.gz$", "")); 
     fos = new FileOutputStream(outFile); 
     byte[] buf = new byte[100000]; 
     int len; 
     while ((len = gin.read(buf)) > 0) { 
      fos.write(buf, 0, len); 
     } 

     fos.close(); 
     if (deleteGzipfileOnSuccess) { 
      infile.delete(); 
     } 
     return outFile; 
    } finally { 
     if (gin != null) { 
      gin.close();  
     } 
     if (fos != null) { 
      fos.close();  
     } 
    }  
} 
+0

Xin chào, tôi có thể đọc các tệp mà không giải thích được không. Tôi muốn một cái gì đó giống như đọc nó từng dòng một. Và, các tệp có thể không chỉ có 80 ký tự/chiều dài. BufferedReader là những gì được sử dụng để làm việc cho tôi. Nhưng, nó không có một hàm tạo cho GzInputStream. –

+0

Tôi muốn viết những gì tôi muốn, chẳng hạn như: BufferedReader in = new BufferedReader (new GzipFileReader (file)); Sau đó triển khai GzipFileReader như mở rộng Reader. – fredarin

2

Về A, lệnh gunzip tạo tệp không nén với tên gốc trừ đi hậu tố .gz. Xem man page.

Về B, Bạn có cần gunzip cụ thể hay thuật toán nén khác sẽ thực hiện? Có một số java port của thuật toán nén LZMA được 7zip sử dụng để tạo các tệp .7z, nhưng nó sẽ không xử lý các tệp .gz.

0

Nếu bạn có số lượng tệp cố định để giải nén một lần, tại sao bạn không sử dụng các công cụ hiện có cho điều đó? Như Paul Morie nhận thấy, gunzip thể làm điều đó: for i in *.gz; do gunzip $i; done Và nó sẽ tự động đặt tên cho chúng, tước .gz$

Trên cửa sổ, cố gắng winrar, có lẽ, hoặc gunzip từ http://unxutils.sf.net

0

GZip thường chỉ được sử dụng một lần tệp, do đó, thường là không chứa thông tin về các tệp riêng lẻ. Để gộp nhiều tệp vào một tệp nén, trước tiên chúng được kết hợp thành một tệp Tar không nén (với thông tin về nội dung riêng lẻ), và sau đó nén thành một tệp duy nhất. Sự kết hợp này được gọi là Tarball.

Có thư viện để trích xuất thông tin tệp riêng lẻ từ một Tar, giống như với ZipEntries. One example. Trước tiên, bạn sẽ phải giải nén tệp .gz vào một tệp tạm thời để sử dụng tệp đó hoặc ít nhất hãy nạp GZipInputStream vào thư viện Tar.

Bạn cũng có thể gọi 7-Zip từ dòng lệnh bằng Java. Cú pháp dòng lệnh 7-Zip là ở đây: 7-Zip Command Line Syntax. Ví dụ về việc gọi trình bao lệnh từ Java: Executing shell commands in Java. Bạn sẽ phải gọi 7-Zip hai lần: một lần để trích xuất Tar từ tệp .tar.gz hoặc .tgz và một lần nữa thành trích xuất các tệp riêng lẻ từ Tar.

Hoặc, bạn có thể làm điều dễ dàng và viết một tập lệnh shell ngắn gọn hoặc tập tin thực thi để giải nén. Không có lý do gì để búa một cái chốt hình vuông trong một lỗ tròn - đây là những tập tin thực thi được tạo ra. Như một phần thưởng, bạn cũng có thể cung cấp cho họ các tham số, làm giảm sự phức tạp của việc thực thi dòng lệnh java một cách đáng kể, trong khi vẫn cho phép thực thi điều khiển java.

0

Các bạn đã thử

gunzip *.gz 
0

.gz tệp (gzipped) có thể lưu trữ tên tệp của tệp nén. Vì vậy, ví dụ FuBar.doc có thể được lưu bên trong myDocument.gz và với giải nén thích hợp, tệp có thể được khôi phục vào tên tệp FuBar.doc. Thật không may, java.util.zip.GZIPInputStream không hỗ trợ bất kỳ cách nào để đọc tên tệp ngay cả khi nó được lưu trữ bên trong kho lưu trữ.

Các vấn đề liên quan