2013-07-17 2 views
0

Как я могу прочитать несколько XML-файлов из потока ввода в Java и записать их в виде файлов XML?Чтение нескольких XML-файлов из потока ввода Java

У меня есть это:

InputStream is = new GZIPInputStream(new FileInputStream(file)); 

Edit: У меня есть файл tar.gz сказать, xmls.tar.gz, который "файл", который содержит несколько файлов XML. Когда я конвертирую его в строку, используя:

public static String convertStreamToString(java.io.InputStream is) { 
     java.util.Scanner s = new java.util.Scanner(is).useDelimiter("\\A"); 
     return s.hasNext() ? s.next() : ""; 
    } 

Я получаю все файлы XML, соединенные вместе, с информацией о файлах. На System.out.println я получаю (это только начало одного файла):

blah.xml 60  0  0  2300 12077203627 10436 0ustar  0  0 <?xml version="1.0"... 

ОТВЕТ:

Это работало отлично подходит для меня, следуя по предложению Кейта использовать Apache Сжать и Io:

http://thinktibits.blogspot.com/2013/01/read-extract-tar-file-java-example.html

import java.io.*; 
import org.apache.commons.compress.archivers.tar.TarArchiveEntry; 
import org.apache.commons.compress.archivers.tar.TarArchiveInputStream; 
import org.apache.commons.io.IOUtils; 
public class unTar { 
     public static void main(String[] args) throws Exception{ 
       /* Read TAR File into TarArchiveInputStream */ 
       TarArchiveInputStream myTarFile=new TarArchiveInputStream(new FileInputStream(new File("tar_ball.tar"))); 
       /* To read individual TAR file */ 
       TarArchiveEntry entry = null; 
       String individualFiles; 
       int offset; 
       FileOutputStream outputFile=null; 
       /* Create a loop to read every single entry in TAR file */ 
       while ((entry = myTarFile.getNextTarEntry()) != null) { 
         /* Get the name of the file */ 
         individualFiles = entry.getName(); 
         /* Get Size of the file and create a byte array for the size */ 
         byte[] content = new byte[(int) entry.getSize()]; 
         offset=0; 
         /* Some SOP statements to check progress */ 
         System.out.println("File Name in TAR File is: " + individualFiles); 
         System.out.println("Size of the File is: " + entry.getSize());     
         System.out.println("Byte Array length: " + content.length); 
         /* Read file from the archive into byte array */ 
         myTarFile.read(content, offset, content.length - offset); 
         /* Define OutputStream for writing the file */ 
         outputFile=new FileOutputStream(new File(individualFiles)); 
         /* Use IOUtiles to write content of byte array to physical file */ 
         IOUtils.write(content,outputFile);    
         /* Close Output Stream */ 
         outputFile.close(); 
       }    
       /* Close TarAchiveInputStream */ 
       myTarFile.close(); 
     } 
} 
+1

Входной поток подключается только к одному файлу за раз. Пожалуйста, подробно расскажите о своей проблеме. – Santosh

+1

http://stackoverflow.com/questions/1080381/gzipinputstream-reading-line-by-line –

+0

Как два файла разделены в потоке? Есть ли делиметр? – f1sh

ответ

2

После ун-сжатия (Gzip) вы все еще должны ООН дегтя. Java JDK не имеет встроенного API для tar, но есть несколько доступных от третьих сторон. См. Этот ответ: How do I extract a tar file in Java?

+0

Не мой InputStream = новый GZIPInputStream (новый FileInputStream (файл)); код, на что указывает ответ в вопросе, на который вы ссылаетесь? – John

+0

Нет, прочитайте ответы, кроме принятых/первых. Первый ответ и ваш GzipInputStream просто дают вам один поток байтов для всех файлов в tar. Это нормально, если вы хотите сами проанализировать эти байты, чтобы выяснить, где заканчивается каждый компонент tar, и т. Д. Лучше использовать API более высокого уровня, который позволяет вам перебирать объекты типа «TarEntry» и получать поток ввода от каждого из те, которые представляют каждый (в вашем случае) XML-файл в tar. Более поздние ответы показывают, как это сделать с кодом из разных библиотек. – Keith

+0

Моя ошибка. Я посмотрю. – John

Смежные вопросы