2015-08-24 2 views
2

Мне нужно предоставить клиенту zip-файл клиенту в системе и позволить клиентам загружать выбранные файлы.Как извлечь определенный файл в zip-файле в java

  1. разобрать почтовый файл и показать на веб-странице. и помните каждое местоположение zipentry (например, файл1 начинается с байта 100 ширины длины 1024 байта) в backend.
  2. загрузить указанный файл, когда клиент нажал кнопку загрузки.

сейчас я помню все местоположения zipentry, но есть ли инструменты java zip для распаковки указанного места в zip-файлах? API как раз как unzip (файл, long entryStart, long entryLength);

+0

прочитать: http://www.mkyong.com/java/how-to-decompress -files-from-a-zip-file/ –

+0

Спасибо, но это не то, что я хочу –

ответ

6

Вы можете использовать следующий код, чтобы извлечь конкретный файл из zip: -

public static void main(String[] args) throws Exception{ 
     String fileToBeExtracted="fileName"; 
     String zipPackage="zip_name_with_full_path"; 
     OutputStream out = new FileOutputStream(fileToBeExtracted); 
     FileInputStream fileInputStream = new FileInputStream(zipPackage); 
     BufferedInputStream bufferedInputStream = new BufferedInputStream(fileInputStream); 
     ZipInputStream zin = new ZipInputStream(bufferedInputStream); 
     ZipEntry ze = null; 
     while ((ze = zin.getNextEntry()) != null) { 
      if (ze.getName().equals(fileToBeExtracted)) { 
       byte[] buffer = new byte[9000]; 
       int len; 
       while ((len = zin.read(buffer)) != -1) { 
        out.write(buffer, 0, len); 
       } 
       out.close(); 
       break; 
      } 
     } 
     zin.close(); 

    } 

Также см эту ссылку: How to extract a single file from a remote archive file?

+0

Он хорошо работает только для одной ситуации, то есть в каждом заголовке записи сохраняется сжатие и размер исходной записи. Но некоторые zip-файлы не сохраняют эту информацию в заголовке записи, в этом случае zin.getNextEntry() будет читать, хотя по предыдущим данным ввода, чтобы перейти к следующей записи, а не искать следующую запись, поэтому она будет работать медленно. –

1

Вы можете попробовать так:

ZipFile zf = new ZipFile(file); 
try { 
    InputStream in = zf.getInputStream(zf.getEntry("file.txt")); 
    // ... read from 'in' as normal 
} finally { 
    zf.close(); 
} 

I havent попробовал, но в Java 7 ZipFileSystem вы можете попробовать это извлечь файл .TXT из zip-файла.

Path zipfile = Paths.get("/samples/ziptest.zip"); 
FileSystem fs = FileSystems.newFileSystem(zipfile, env, null); 
final Path root = fs.getPath("/file.TXT"); 
3

Это может быть сделано без баловаться с байтовых массивов или входных потоков с помощью Java 7 в NiO 2:

public void extractFile(Path zipFile, String fileName, Path outputFile) throws IOException { 
    // Wrap the file system in a try-with-resources statement 
    // to auto-close it when finished and prevent a memory leak 
    try (FileSystem fileSystem = FileSystems.newFileSystem(zipFile, null)) { 
     Path fileToExtract = fileSystem.getPath(fileName); 
     Files.copy(fileToExtract, outputFile); 
    } 
}