Распаковка Zip ByteArray возвращает ноль, но входной поток действителен - PullRequest
0 голосов
/ 15 апреля 2020

Итак, я пытаюсь сжать файл CSV в памяти, сохранить его как BLOB в MYSQL, а затем извлечь и распаковать его, но ZipInputStream.getEntry возвращает ноль, и я действительно не могу распаковать файл, я пытался все, и я действительно не могу найти ответ. В первый раз я сжал / распаковал файл с помощью GZIP и работал, но это изменило структуру файла CSV, поэтому я пытаюсь использовать Zip. CSV-файл получен из внешнего интерфейса с помощью Spring. MultipartFile.getBytes ().

Вот заголовок сжатого файла, видимый из БД (заголовок кажется действительным)

00000000  50 4B 03 04 14 00 08 08 08 00 B4 A0 8F 50 00 00    PK........´ .P..

Заранее спасибо !

Метод сжатия:

@Throws(Exception::class)
fun compressFile(file : ByteArray) : ByteArray {
    val baos = ByteArrayOutputStream()
    val zos = ZipOutputStream(baos)
    val entry = ZipEntry("data.csv")
    entry.size = file.size.toLong()
    zos.putNextEntry(entry)
    zos.write(file)
    zos.closeEntry()
    zos.close()
    return baos.toByteArray()
}

Метод декомпрессии:

@Throws(Exception::class)
fun decompressFile(file : ByteArray): ByteArray {
   if (file.isEmpty()) return file
   val gis = ZipInputStream(ByteArrayInputStream(file))
   val bf = BufferedReader(InputStreamReader(gis, "UTF-8"))
   var outStr = ""
   var line: String
   while (bf.readLine().also { line = it ?: "" } != null) {
       outStr += line
   }
   gis.close()
   bf.close()
   return outStr.toByteArray()
}

Объект ZipInputStream после init

1 Ответ

2 голосов
/ 15 апреля 2020

Чтобы прочитать ZipInputStream, вы должны позвонить getNextEntry() перед чтением.

Для этого примера я создал zip-файл с 2 файлами:

  • foo.text с содержимым Foo Bar
  • hello.txt с содержимым Hello World

Вот код, показывающий, что попытка чтения перед вызовом getNextEntry() ничего не даст:

public static void main(String[] args) throws Exception {
    try (ZipInputStream zip = new ZipInputStream(new FileInputStream("C:\\Temp\\foo.zip"))) {
        BufferedReader reader = new BufferedReader(new InputStreamReader(zip, "UTF-8"));

        // read before getNextEntry() finds nothing
        printText(reader);

        ZipEntry zipEntry;
        while ((zipEntry = zip.getNextEntry()) != null) {
            System.out.println("Entry Name: " + zipEntry.getName() + "   Size: " + zipEntry.getSize());

            // read after getNextEntry() finds only the entry's content
            printText(reader);
        }
    }
}
static void printText(BufferedReader reader) throws IOException {
    int count = 0;
    for (String line; (line = reader.readLine()) != null; count++)
        System.out.println("  " + line);
    System.out.println(count + " lines");
}

Выход

0 lines
Entry Name: foo.txt   Size: 7
  Foo Bar
1 lines
Entry Name: hello.txt   Size: 11
  Hello World
1 lines
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...