Я нуждаюсь в том, чтобы разжать папку с 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í
Ты путаешь разгрузку Сип (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();
}
}
}
}
Я взял свободу меняния размера буфера на круглое число (в бинарном). Но независимо от использованного числа не является рекомендуемым повторять это из-за нескольких сайтов кода, лучше определять постоянную величину и использовать эту постоянную величину в коде.
while ((entrada = flujo.getNextEntry()) != null)
я перемещаю его маршрут ввода, zip содержит две папки и внутри папок есть два изображения – Jeferson Martinez 10.09.2016, 23:56