2012-11-09 9 views
6

Pobrałem wpis zip z pliku zip, jak w przykładzie.Zapisywanie danych ZipEntry na ciąg

InputStream input = params[0]; 
ZipInputStream zis = new ZipInputStream(input); 

ZipEntry entry; 
try { 
    while ((entry = zis.getNextEntry())!= null) { 

    } 
} catch (IOException e) { 
    // TODO Auto-generated catch block 
    e.printStackTrace(); 
} 

To działa dobrze, a jego uzyskanie ZipEntry nie stanowi problemu.

moje pytanie

Jak zdobyć zawartość tych ZipEntries do łańcucha, ponieważ są one xml i csv plików.

Odpowiedz

6

trzeba czytać od ZipInputStream:

StringBuilder s = new StringBuilder(); 
byte[] buffer = new byte[1024]; 
int read = 0; 
ZipEntry entry; 
while ((entry = zis.getNextEntry())!= null) { 
     while ((read = zis.read(buffer, 0, 1024)) >= 0) { 
      s.append(new String(buffer, 0, read)); 
     } 
} 

Po wyjściu z wewnętrznej while zapisać zawartość StringBuilder i zresetować go.

+0

blackbelt na ratunek ponownie. Dziękuję mojemu przyjacielowi – StuStirling

+0

serdecznie zapraszamy – Blackbelt

+1

Podejście to złamie znaki Unicode, które są dwa bajty lub więcej. –

2

Oto podejście, które nie łamie znaki Unicode:

final ZipInputStream zis = new ZipInputStream(new ByteArrayInputStream(content)); 
final InputStreamReader isr = new InputStreamReader(zis); 
final StringBuilder sb = new StringBuilder(); 
final char[] buffer = new char[1024]; 

while (isr.read(buffer, 0, buffer.length) != -1) { 
    sb.append(new String(buffer)); 
} 

System.out.println(sb.toString()); 
+0

Czy mógłbyś opisać, w jaki sposób wersja @Blackbelt złamie Unicode? Jego wersja brzmi, dopóki nie pozostanie nic (tj. Wszystkie części Unicode, których bym oczekiwał), podczas gdy twoja wersja zawsze dodaje cały bufor, tworząc końcowy Ciąg, który jest znacznie dłuższy niż entry.getSize() – Zefiro

+0

Ok, I zobacz teraz, że używasz char [] zamiast bajtu []. Proponuję uczynić to bardziej widocznym w odpowiedzi, a także dodać tylko tyle bufora, ile czytasz. Obecnie wynikowy ciąg jest zaokrąglany do rozmiaru bufora. – Zefiro

0

z zestawem kodowania (UTF-8) i bez tworzenia łańcuchów:

import java.util.zip.ZipInputStream; 
import java.util.zip.ZipEntry; 
import java.io.ByteArrayOutputStream; 
import static java.nio.charset.StandardCharsets.UTF_8; 
String charset = "UTF-8"; 

try (
    ZipInputStream zis = new ZipInputStream(input, UTF_8); 
    ByteArrayOutputStream baos = new ByteArrayOutputStream() 
) { 
    byte[] buffer = new byte[1024]; 
    int read = 0; 
    ZipEntry entry; 
    while ((entry = zis.getNextEntry()) != null) 
    while ((read = zis.read(buffer, 0, buffer.length)) > 0) 
     baos.write(buffer, 0, read); 
    String content = baos.toString(charset); 
} 
Powiązane problemy