2010-11-01 3 views
1

Сейчас я разрабатываю приложение с использованием Google App Engine (GAE). GAE не позволяет мне создавать временную папку для меня, чтобы хранить мой zip-файл и читать с него. Единственный способ - прочитать его из памяти. Zipfile содержит 6 файлов CSV, которые мне нужно прочитать в CSVReader.Как читать ZipInputStream в CharArrayReader

//part of the code 

MultipartFormDataRequest multiPartRequest = null; 

Hashtable files = multiPartRequest.getFiles(); 

UploadFile userFile = (UploadFile)files.get("bootstrap_file"); 

InputStream input = userFile.getInpuStream(); 

ZipInputStream zin = new ZipInputStream(input); 

Как я прочитал ZipInputStream в полукокс [], который необходим для создания CharArrayReader для моего объекта CSVReader.

CSVReader reader = new CSVReader(CharArrayRead(char[] buf)); 

ответ

3

Оберните ZipInputStream с помощью InputStreamReader для преобразования из байтов в символы; затем вызвать inputStreamReader.read (символ [] ЬиЕ, Int смещения, внутр длина), чтобы заполнить обугленного [] буфер, как это:

//part of the code 
MultipartFormDataRequest multiPartRequest = null; 
Hashtable files = multiPartRequest.getFiles(); 
UploadFile userFile = (UploadFile)files.get("bootstrap_file"); 
InputStream input = userFile.getInpuStream(); 
ZipInputStream zin = new ZipInputStream(input); 

// wrap the ZipInputStream with an InputStreamReader  
InputStreamReader isr = new InputStreamReader(zin); 
ZipEntry ze; 
// ZipEntry ze gives you access to the filename etc of the entry in the zipfile you are currently handling 
while ((ze = zin.getNextEntry()) != null) { 
    // create a buffer to hold the entire contents of this entry 
    char[] buf = new char[(int)ze.getSize()]; 
    // read the contents into the buffer 
    isr.read(buf); 
    // feed the char[] to CSVReader 
    CSVReader reader = new CSVReader(CharArrayRead(buf)); 
} 

если ваш CharArrayRead фактически java.io.CharArrayReader, то есть нет необходимости, чтобы загрузить его в полукокса [], и вы бы лучше с кодом, как это:

InputStreamReader isr = new InputStreamReader(zin); 
BufferedReader br = new BufferedReader(isr); 
ZipEntry ze; 
while ((ze = zin.getNextEntry()) != null) { 
    CSVReader reader = new CSVReader(br); 
} 

Если вы просто один архивный файл (пытаясь обойти ограничение 1Мб), то это будет работать :

InputStreamReader isr = new InputStreamReader(zin); 
zip.getNextEntry(); 
CSVReader reader = new CSVReader(isr, ...); 
+0

У меня есть 6 ZipEntry (6 cs v файл внутри zipinputstream). Итак, как точно указать нужный ZipEntry на правый CSVReader? И как мне «обернуть» ZipInputStream с помощью InputStreamReader? –

+1

вы используете ZipInputStream.getNextEntry() для перехода к следующей записи в zip-файле; Я отредактирую свой ответ с помощью кода-образца. –

+0

ничего себе! он работает как магия !! благодаря! –