2016-03-26 12 views
1

Bir zip dosyasında bulunan birden çok gzpli json dosyasını bir InputStream aracılığıyla ayrıştırmaya çalışıyorum http bağlantısı.Herhangi bir dosyayı diske kaydetmeden bir zip giriş akışında bulunan birden fazla gzipped json dosyasını ayrıştırma (google uygulama altyapısı nedeniyle)

İlk dosyayı okumayı başardım ama daha fazlasını değil. Bazen başarısız olur ve tüm (ilk) dosyayı okumaz. Bağlantıda içerik uzunluğu üstbilgisini kontrol ettim ve tüm dosyayı okumadığımda bile aynı.

Bulduğum örneklerin çoğunun yerel olarak dosya kaydetmesine izin vermeyen goole app engine kullanıyorum.

Zip dosyası için https://commons.apache.org/proper/commons-compress/'dan ZipArchiveInputStream kullanıyorum. Bu benim bulmak mümkün oldum en yakından ilişkili soru

: How to read from file containing multiple GzipStreams

private static ArrayList<RawEvent> parseAmplitudeEventArchiveData(HttpURLConnection connection) 
     throws IOException, ParseException { 
    String name, line; 
    ArrayList<RawEvent> events = new ArrayList<>(); 

    try (ZipArchiveInputStream zipInput = 
       new ZipArchiveInputStream(connection.getInputStream(), null, false, true);) { 

     ZipArchiveEntry zipEntry = zipInput.getNextZipEntry(); 
     if (zipEntry != null) { 

      try(GZIPInputStream gzipInputStream = new GZIPInputStream(connection.getInputStream()); 
      BufferedReader reader = new BufferedReader(new InputStreamReader(gzipInputStream))) { 

       name = zipEntry.getName(); 
       log.info("Parsing file: " + name); 

       while ((line = reader.readLine()) != null) { 
        events.add(parseJsonLine(line)); 
       } 
       log.info("Events size: " + events.size()); 
      } 
     } 
    } 
    return events; 
} 
+0

Sana giriş akışı kullandığından bu nasıl çalıştığını merak GZIPInputStream bağlantısından. Ama gerçekten istediğiniz şey ZipArchiveInputStream için verileri okumak ve bu verilerden bir GZIPInputStream oluşturmaktır. –

+0

@ MartinKrüger evet Aynı şeyi merak ettim ... eğer bir "IOException: Kesilmiş ZIP ​​dosyası" aldığım önerisini değiştirirsem – Jitan

cevap

0

Bu benim için çalışıyor:

public class UnzipZippedFiles { 

    public static void main(String[] args) throws IOException, ParseException { 
     FileInputStream inputStream = new FileInputStream("/home/me/dev/scratchpad/src/main/resources/files.zip"); 
     unzipFile(inputStream); 
    } 

    private static void unzipFile(InputStream inputStream) 
      throws IOException, ParseException { 
     try (ZipArchiveInputStream zipInput = 
        new ZipArchiveInputStream(inputStream, null, false, true);) { 

      ZipArchiveEntry zipEntry; 

      while ((zipEntry = zipInput.getNextZipEntry()) != null) { 
       System.out.println("File: " + zipEntry.getName()); 

       byte[] fileBytes = readDataFromZipStream(zipInput, zipEntry); 

       ByteArrayInputStream byteIn = new ByteArrayInputStream(fileBytes); 
       unzipGzipArchiveAndPrint(byteIn); 
      } 
     } 
    } 

    private static byte[] readDataFromZipStream(ZipArchiveInputStream zipStream, ZipArchiveEntry entry) throws IOException { 
     byte[] data = new byte[(int) entry.getSize()]; 
     zipStream.read(data); 

     return data; 
    } 

    private static void unzipGzipArchiveAndPrint(InputStream inputStream) throws IOException { 
     System.out.println("Content:"); 
     try (GZIPInputStream gzipInputStream = new GZIPInputStream(inputStream); 
      BufferedReader reader = new BufferedReader(new InputStreamReader(gzipInputStream))) { 

      String line; 
      while ((line = reader.readLine()) != null) { 
       System.out.println(line); 
      } 
     } 
    } 
} 
+0

Bu sorunla karşılaşıyorum, input.getSize -1 döndürüyor. Sanırım sahip olduğum zip dosyasıyla ilgili bir şey var sanırım, ama bunu terminalden 'unzip' komutuyla çıkarmak için çalışıyor. – Jitan

+0

ZipArchiveEntry nedir? –