Не знаю в чем дело, но при вызове getNextEntry получаю только один ZipEntry,а после него только null, то есть первый файл и поток к нему открывается, и он успешно записывается, но обратиться к остальным потокам не могу. Посмотрев решения я понял что многие решили через ArrayList, но поскольку я плохо понимаю потоки, хотелось бы понять в чем ошибка, чтобы разбираться в проблеме лучше.
P.S. Попробовал использовать ArrayList-та же проблема.
P.P.S. В итоге оказалось, что проблема в неправильной сортировке файлов, почему она не правильная, я не знаю, поскольку нет возможности сделать проверку. Ошибка доступа другого zipEntry как была так и осталась, причем, насколько я понял, она зависит отчасти от того, на какой машине запускается код. В чем всетаки причина этой ошибки пока не понятно, если у кого то будут идеи, буду рад услышать.
package com.javarush.task.task31.task3106;
import java.io.*;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Enumeration;
import java.util.Vector;
import java.util.zip.ZipEntry;
import java.util.zip.ZipInputStream;
import java.util.zip.ZipOutputStream;
/*
Разархивируем файл
*/
public class Solution {
public static void main(String[] args) {
/*
String[] args = new String[6];
args[0] = "C:/JavaRushTasks/test/test2/pazzleTest/messgae.txt";
args[1] = "C:/JavaRushTasks/test/test2/pazzleTest/A.zip";
args[2] = "C:/JavaRushTasks/test/test2/pazzleTest/B.zip";
args[3] = "C:/JavaRushTasks/test/test2/pazzleTest/D.zip";
args[4] = "C:/JavaRushTasks/test/test2/pazzleTest/C.zip";
args[5] = "C:/JavaRushTasks/test/test2/pazzleTest/E.zip";
*/
File resultFileName = new File(args[0]);
ArrayList<File> fileList = new ArrayList<>();
for(int i = 1; i < args.length; i++){
fileList.add(new File(args[i]));
}
Collections.sort(fileList);
Vector<FileInputStream> vector = new Vector<>(fileList.size());
try {
for(File file : fileList){
vector.add(new FileInputStream(file));
}
} catch (FileNotFoundException e) {
e.printStackTrace();
}
Enumeration<FileInputStream> v = vector.elements();
try(ZipInputStream zipInputStream = new ZipInputStream(new SequenceInputStream(v));
FileOutputStream fileOutputStream = new FileOutputStream(resultFileName)){
int l;
while(zipInputStream.getNextEntry() != null){
byte[] bytesFromEntry = new byte[6400];
while((l = zipInputStream.read(bytesFromEntry)) != -1){
fileOutputStream.write(bytesFromEntry,0,l);
}
zipInputStream.closeEntry();
}
}catch (Exception e){
e.printStackTrace();
}
/*ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
for(File file: fileList){
try {
ZipInputStream zipInputStream = new ZipInputStream(new FileInputStream(file));
byte[] bytesFromEntry = new byte[6400];
while((zipInputStream.getNextEntry()) != null){
int l;
while((l = zipInputStream.read(bytesFromEntry)) > 0){
byteArrayOutputStream.write(bytesFromEntry,0,l);
}
}
zipInputStream.closeEntry();
zipInputStream.close();
} catch (IOException e) {
e.printStackTrace();
}
}
try(FileOutputStream fileOutputStream = new FileOutputStream(resultFileName)){
ByteArrayInputStream byteArrayInputStream = new ByteArrayInputStream(byteArrayOutputStream.toByteArray());
byte[] bytesFromByteArrayStream = new byte[6400];
while(byteArrayInputStream.available() > 0){
int l = byteArrayInputStream.read(bytesFromByteArrayStream);
fileOutputStream.write(bytesFromByteArrayStream,0,l);
}
}catch (Exception e){
}*/
}
}