Есть вот такой метод:
public boolean saveZip(File zipFile) {
Log.d(LOG_TAG, zipFile.getAbsolutePath());
boolean result = false;
if (!zipFile.exists()) zipFile.getParentFile().mkdirs();
try {
ZipOutputStream zipOutputStream = new ZipOutputStream(new BufferedOutputStream(new FileOutputStream(zipFile)));
JsonWriter writer = new JsonWriter(new OutputStreamWriter(zipOutputStream, "UTF-8"));
// Запись таблицы DB_TABLE_NAME в архив
Log.d(LOG_TAG, "ЗАПИСЬ: " + DB_TABLE_NAME + ".json");
Cursor cursor = getAllData(); // основная таблица данных;
{
ZipEntry entry = new ZipEntry(DB_TABLE_NAME + ".json");
zipOutputStream.putNextEntry(entry);
writer.beginArray();
while (cursor.moveToNext()) {
writer.beginObject();
writer.name(_ID)
.value(cursor.getLong(cursor.getColumnIndex(_ID)));
writer.name(COLUMN_PARENT)
.value(cursor.getLong(cursor.getColumnIndex(COLUMN_PARENT)));
writer.name(COLUMN_THING_NAME)
.value(cursor.getString(cursor.getColumnIndex(COLUMN_THING_NAME)));
writer.name(COLUMN_DESCRIPTION)
.value(cursor.getString(cursor.getColumnIndex(COLUMN_DESCRIPTION)));
writer.name(COLUMN_DATE)
.value(cursor.getString(cursor.getColumnIndex(COLUMN_DATE)));
writer.name(COLUMN_ISBOX)
.value(cursor.getInt(cursor.getColumnIndex(COLUMN_ISBOX)));
writer.endObject();
}
writer.endArray();
cursor.close();
writer.close();
zipOutputStream.closeEntry();
}
// Запись таблицы DB_TABLE_NAME_FOTOS в архив
Log.d(LOG_TAG, "ЗАПИСЬ: " + DB_TABLE_NAME_FOTOS + ".json");
cursor = getAllDataNameFotos();
List
// Сохраняем фотки в архив
{
Log.d(LOG_TAG, "Сохраняем фото в архив");
for (String fotoName : fotos) {
File fileFoto = new File(fotoDir, fotoName);
if (fileFoto.isFile()) {
ZipEntry entry = new ZipEntry(fileFoto.getName());
zipOutputStream.putNextEntry(entry);
byte[] buffer = new byte[1024];
int length;
InputStream inputStream = new FileInputStream(fileFoto);
while ((length = inputStream.read(buffer)) > -1) {
zipOutputStream.write(buffer, 0, length);
}
inputStream.close();
zipOutputStream.closeEntry();
}
}
}
// запись таблицы DB_TABLE_NAME_ATTR
Log.d(LOG_TAG, "ЗАПИСЬ: " + DB_TABLE_NAME_ATTR + ".json");
cursor = getAllDataNameAttr();
{
ZipEntry entry = new ZipEntry(DB_TABLE_NAME_ATTR + ".json");
zipOutputStream.putNextEntry(entry);
writer.beginArray();
while (cursor.moveToNext()) {
writer.beginObject();
writer.name(_ID)
.value(cursor.getLong(cursor.getColumnIndex(_ID)));
writer.name(COLUMN_NAME_ATTR)
.value(cursor.getString(cursor.getColumnIndex(COLUMN_NAME_ATTR)));
writer.endObject();
}
writer.endArray();
cursor.close();
zipOutputStream.closeEntry();
}
// запись таблицы DB_TABLE_NAME_LIST_ATTR
cursor = getAllDataNameListAttr();
{
ZipEntry entry = new ZipEntry(DB_TABLE_NAME_LIST_ATTR + ".json");
zipOutputStream.putNextEntry(entry);
writer.beginArray();
while (cursor.moveToNext()) {
writer.beginObject();
writer.name(_ID)
.value(cursor.getLong(cursor.getColumnIndex(_ID)));
writer.name(COLUMN_ID_THING)
.value(cursor.getLong(cursor.getColumnIndex(COLUMN_ID_THING)));
writer.name(COLUMN_ID_ATTR)
.value(cursor.getLong(cursor.getColumnIndex(COLUMN_ID_ATTR)));
writer.name(COLUMN_DESCRIPTION_ATTR)
.value(cursor.getString(cursor.getColumnIndex(COLUMN_DESCRIPTION_ATTR)));
writer.endObject();
}
writer.endArray();
cursor.close();
zipOutputStream.closeEntry();
}
zipOutputStream.close();
} catch (IOException e){
Log.d(LOG_TAG, e.toString());
return result;
}
result = true;
return result;
}
Проблема в том что метод writer.close() полностью закрывает и zipOutputStream, и дальше метод 'zipOutputStream.closeEntry()' не срабатывает. А если убрать метод writer.close(), то работает, но файлы в архиве пустые получаются.
Ответ
В итоге нашел два способа решения проблемы:
1) Для каждого нового файла json, создавать новый объект writer, в конце создания файла использовать метод writer.flush() (как и подсказали в комментариях), только ни в коем случае не использовать метод writer.close
2) Использовать свой класс наследованный от ZipOutputStream. Вот какой класс у меня получился:
private class MyZipOutputStream extends ZipOutputStream{
public MyZipOutputStream(OutputStream os) {
super(os);
}
@Override
public void close() throws IOException {
super.closeEntry();
}
public void closeclose() throws IOException {
super.close();
}
}
Получается что объект при использовании метода close() закрывает Entry. То есть при закрытии writer, не происходит полное закрытие 'zipOutputStream'. Только отдельно добавлен метод closeclose() который и будет осуществлять полное закрытие zip-файла.
Комментариев нет:
Отправить комментарий