Разжимать папку с java

Я нуждаюсь в том, чтобы разжать папку с java однако я не функционирует класс

package controlador;
import java.io.BufferedInputStream;  
import java.io.BufferedOutputStream;  
import java.io.FileInputStream;  
import java.io.FileOutputStream;
import java.util.zip.ZipInputStream;

public class Descomprime {  
       public void Descomprimir (String c, String d )throws Exception{

    ZipInputStream entrada = new ZipInputStream(new BufferedInputStream(new FileInputStream(c)));
    if(entrada.getNextEntry()==null)
    {
        int leido;
        byte []buffer = new byte [4758];
        BufferedOutputStream salida = new BufferedOutputStream(new FileOutputStream(d),4758);
        while((leido = entrada.read(buffer, 0, 4758))!=1)
            salida.write(buffer, 0, leido);
            salida.flush();
            salida.close();
            entrada.close();
        }
    }
}

Меня бросает ошибка в линии

BufferedOutputStream salida = new BufferedOutputStream(new FileOutputStream(d),4758);
    while((leido = entrada.read(buffer, 0, 4758))!=1)
    introducir el código aquí
1
задан 24.05.2017, 20:21
1 ответ

Ты путаешь разгрузку Сип (ZipInputStream) с поступающими данными (ZipEntry). Правильное состояло бы в том, чтобы сохранять entry в переменной и действовать, когда он отличный в null, не, когда он равен:

    ZipInputStream flujo = new ZipInputStream(new BufferedInputStream(
                             new FileInputStream(c)));
    ZipEntry entrada = flujo.getNextEntry();
    if ( entrada != null) {

В линии:

while ((leido = entrada.read(buffer, 0, 4758)) != 1)

entrada.read возврати число прочитанных байт или-1, если он подошел близко в конце ввода. Когда он возвращает-1, это провоцирует исключение на линию:

            salida.write(buffer, 0, leido);

попросив, чтобы он написал-1 байт.

Правильное состояло бы в том, чтобы сравнивать, что его нет-1:

while ((leido = entrada.read(buffer, 0, 4758)) != -1)

Также нужно иметь в виду, что ZIP может содержать папки кроме файлов. Мы не можем относиться просто ко всем entries как будто это были файлы.

        if (entrada.isDirectory()) {
            File directorio = new File(nombreSalida);
            directorio.mkdir();
        }

В конце концов, ZIP может содержать несколько файлов (поступающие данные или entries), которого не достаточен if, нужно пробегать их в цикле, чтобы получать все файлы и разжимать их. Следующий - полный код:

package controlador;

import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.util.zip.ZipEntry;
import java.util.zip.ZipInputStream;

public class Descomprime {

  public void Descomprimir(String ficheroZip, String directorioSalida)
          throws Exception {
    final int TAM_BUFFER = 4096;
    byte[] buffer = new byte[TAM_BUFFER];

    ZipInputStream flujo = null;
    try {
      flujo = new ZipInputStream(new BufferedInputStream(
              new FileInputStream(ficheroZip)));
      ZipEntry entrada;
      while ((entrada = flujo.getNextEntry()) != null) {
        String nombreSalida = directorioSalida + File.separator
                + entrada.getName();
        if (entrada.isDirectory()) {
          File directorio = new File(nombreSalida);
          directorio.mkdir();
        } else {
          BufferedOutputStream salida = null;
          try {
            int leido;
            salida = new BufferedOutputStream(
                    new FileOutputStream(nombreSalida), TAM_BUFFER);
            while ((leido = flujo.read(buffer, 0, TAM_BUFFER)) != -1) {
              salida.write(buffer, 0, leido);
            }
          } finally {
            if (salida != null) {
              salida.close();
            }
          }
        }
      }
    } finally {
      if (flujo != null) {
        flujo.close();
      }

    }
  }
}

Я взял свободу меняния размера буфера на круглое число (в бинарном). Но независимо от использованного числа не является рекомендуемым повторять это из-за нескольких сайтов кода, лучше определять постоянную величину и использовать эту постоянную величину в коде.

1
ответ дан 24.11.2019, 13:26
  • 1
    все, что это выполнило, и debug не вводит информацию в компьютер в условии while ((entrada = flujo.getNextEntry()) != null) я перемещаю его маршрут ввода, zip содержит две папки и внутри папок есть два изображения – Jeferson Martinez 10.09.2016, 23:56
  • 2
    маршрут, который произошел с ним, где esrta zip - Y:\casaentrada\Lote012016083056.zip, и где разжимает Y:\casaentrada\Lote012016083056 – Jeferson Martinez 11.09.2016, 00:04
  • 3
    В Вашем моменте prob и # 233; и сейчас я вновь тестировал это и функционируй хорошо. и #191; возможно, что ты переместил его маршрут " Y:\casaentrada\Lote012016083056.zip"? в этом случае est и # 225; плохо, потому что \он для последовательностей утечки. Ты должен использовать " Y: \\casaentrada \\Lote012016083056.zip" и то же самое в другом маршруте. – Jose Antonio Reinstate Monica 11.09.2016, 00:11
  • 4
    действительно так эта с \\или иначе он это берет как ошибка – Jeferson Martinez 11.09.2016, 18:33
  • 5
    Так как не, что у тебя может быть проблема. и #191; Цюй и # 233; операционная система ты используешь? и #191; Q и # 250; и он возвращает тебя java - версия? и #191; Можешь помещать каждые ты c и # 243; я говорю в файле descargable, помещая tambi и # 233; n Lote012016083056.zip, с которым ты делаешь доказательства, и пересылать это в alg и # 250; n я осаждаю с того, который может загружать это мне? Или если это файл, который ты не можешь пересылать из-за того, что являешься конфиденциальный, перешли другой, который делал бы ты, и в котором случалась бы та же неудача. – Jose Antonio Reinstate Monica 11.09.2016, 18:57