С чего начать при создании приложения / системы, которая сжимает и распаковывает файл

В настоящее время я разрабатываю приложение на Java/Android, которое позволяет пользователю сжимать и распаковывать файлы. Сначала я начал изучать размер файла, например:

1Byte = 8Bits
1KB = 1024Byte
1MB = 1024KB
1GB = 1024MB
1TB = 1024GB
1PB = 1024TB
1EB = 1024PB
1ZB = 1024EB
1YB = 1024ZB

После того, как я изучил это, я изучил и прочитал некоторые статьи в сети и обнаружил, что существует 2 типа сжатия файлов (исправьте меня, если я ошибаюсь): Lossless и Lossy. Сжатие без потерь означает, что файл сжимается в меньший бит без потери какого-либо отдельного файла, в то время как сжатие с потерями означает, что важные файлы были удалены при сжатии файла.

Я также читал, что сжатие (метод кодирования по длине прогона) выглядит так:

AAABBCCDFFFFEEEEH

к этому:

3A2B2CD4F4EH  

что дает мне представление о том, как сжатие / распаковка работает на файл.

Я также искал в сети, что есть API для сжатия файлов на Java(также применимо на Android), который

java.util.zip

Я также попробовал некоторые коды для сжатия и распаковки файлов с различных полезных сайтов / форума / и т. Д. (Включая stackru.com), что дает мне опыт в этом исследовании.

Я также читал об алгоритмах, используемых в сжатии данных, которые

 Huffman encoding algorithm -  assigns a code to characters in a file based on how frequently those characters occur

run-length encoding - generates a two-part value for repeated characters: the first part specifies the number of times the character is repeated, and the second part identifies the character

Lempel-Ziv algorithm - converts variable-length strings into fixed-length codes that consume less space than the original strings.

Теперь мне нужно знать, как кодировать алгоритм сжатия и распаковки файла, используя java.util.zip (я также не знаю, как его использовать. Уроки по сети не работают для меня:/). Какой алгоритм использует winzip, winrar, сжатую папку (windows) и androzip(приложение для Android)? Кто-нибудь, пожалуйста, научите меня шаг за шагом (относитесь ко мне как к необразованному человеку) о том, как работает java.util.zip и о различных алгоритмах. извините за длинный пост людей. Спасибо за будущую помощь и посты (если будут)!

1 ответ

public static final byte[] unzip(byte[] in) throws IOException {
// decompress using GZIPInputStream 
ByteArrayOutputStream outStream = 
  new ByteArrayOutputStream(EXPECTED_COMPRESSION_RATIO * in.length);

GZIPInputStream inStream = 
  new GZIPInputStream ( new ByteArrayInputStream(in) );

byte[] buf = new byte[BUF_SIZE];
while (true) {
  int size = inStream.read(buf);
  if (size <= 0) 
    break;
  outStream.write(buf, 0, size);
}
outStream.close();

return outStream.toByteArray();
}


public static final byte[] zip(byte[] in) {
try {
  // compress using GZIPOutputStream 
  ByteArrayOutputStream byteOut= 
    new ByteArrayOutputStream(in.length / EXPECTED_COMPRESSION_RATIO);

  GZIPOutputStream outStream= new GZIPOutputStream(byteOut);

  try {
    outStream.write(in);
  } catch (Exception e) {
    LOG.error("", e);
  }

  try {
    outStream.close();
  } catch (IOException e) {
      LOG.error("", e);
  }

  return byteOut.toByteArray();

} catch (IOException e) {
    LOG.error("", e);
  return null;
}
}
Другие вопросы по тегам