Я использую класс ZipOutputStream для записи большого zip-файла.Java ZipOutputStream пишет некоторые файлы, но не другие
Он отлично работает, когда zip-файл имеет только 1000 подфайлов и подпапок. Он также отлично работает, когда zip-файл имеет только 10000 подфайлов и подпапок.
Но по какой-то причине, когда я наращиваю его до более чем 100000 подфайлов и подпапок, возникает проблема.
Он все равно напишет большой кусок субфайлов, но затем он уйдет. В итоге у меня есть zip-файл, содержащий около половины дерева каталогов, которое я ожидал.
Почтовый файл НЕ ДОЛЖЕН БЫТЬ крышей размером 4 ГБ. После завершения, zip-файл составляет всего около 30 МБ в целом. Каждый подфайл в zip-файле имеет размер менее 1 КБ.
Компоновка архива прост:
В корневой папке должен держать десять подкаталогов.
Каждый из этих подкаталогов должен содержать десять подкаталогов.
Это продолжается до четвертого уровня, где каждый подкаталог содержит десять файлов.
Но после выполнения первый уровень содержит только 5 каталогов, а последний каталог первого уровня содержит только два подкаталога.
Вот соответствующий код:
public class MyZipFile{
MyFolder folder;
public void create(String[] haystack){
folder = new MyFolder();
folder.create(haystack);
}
public void writeToDisk(String rootPath){
FileOutputStream rootFile;
BufferedOutputStream rootBuffer;
ZipOutputStream rootZip;
try{
rootFile = new FileOutputStream(rootPath);
rootBuffer = new BufferedOutputStream(rootFile);
rootZip = new ZipOutputStream(rootBuffer);
folder.writeToDisk(rootZip);
rootZip.close();
}
}
}
И
public class MyKeyFolder extends MyFileSystemElement {
private final int numSubfiles = 10;
private MyFileSystemElement[] subfiles;
public MyFolder(int[] catalogNumber){
super(catalogNumber);
subfiles = new MyFileSystemElement[numSubfiles];
}
@Override
public void create(String[] haystack){
for(int i=0; i < numSubfiles; i++){
MyFileSystemElement element;
int[] subCatalogNumber = createSubCatalogNumber(i);
//finalFolderLevel determines how many files are in the ZIP
//When finalFolderLevel is 2, there are about 1000 subfiles.
//When finalFolderLevel is 3, there are about 10000 subfiles.
//When finalFolderLevel is 4, there are about 100000 subfiles
//(and this is where I run into trouble).
if(thisFolderLevel <= finalFolderLevel)
element = new myFolder(subCatalogNumber);
else
element = new myFile(subCatalogNumber);
subfiles[i] = element;
subfiles[i].create(haystack);
}
}
@Override
public void writeToDisk(ZipOutputStream zipStream) throws IOException {
String path = createPathFromCatalogNumber();
zipStream.putNextEntry(new ZipEntry(path));
zipStream.flush();
zipStream.closeEntry();
for(MyFileSystemElement file : subfiles){
file.writeToDisk(zipStream);
}
}
}
И
public class MyFile extends MyFileSystemElement {
private String fileContents;
@Override
public void create(String[] haystack){
fileContents = "";
fileContents += haystack[deriveIndex(0)] + "\n";
fileContents += haystack[deriveIndex(1)] + "\n";
fileContents += haystack[deriveIndex(2)] + "\n";
fileContents += haystack[deriveIndex(3)] + "\n";
fileContents += haystack[deriveIndex(4)] + "\n";
fileContents += haystack[deriveIndex(5)] + "\n";
fileContents += haystack[deriveIndex(6)] + "\n";
fileContents += haystack[deriveIndex(7)] + "\n";
fileContents += haystack[deriveIndex(8)] + "\n";
fileContents += haystack[deriveIndex(9)] + "\n";
}
@Override
public void writeToDisk(ZipOutputStream zipStream) throws IOException {
String path = createPathFromCatalogNumber();
ZipEntry entry = new ZipEntry(path);
byte[] contents = fileContents.getBytes();
zipStream.putNextEntry(entry);
zipStream.write(contents);
zipStream.flush();
zipStream.closeEntry();
}
}
Я интересно, если ZipOutputStream имеет максимальное количество файлов, которые он может написать перед ним просто уходит. Или, может быть, FileOutputStream. Я не уверен.
Ваша помощь приветствуется. Спасибо.
@PickenВыберите, похоже ли, что вы попадаете в пределы INFO-ZIP, описанные мной здесь? Если да, то принимайте и повышайте :) –
Спасибо. Это все объясняет. Я попытался поддержать ваш комментарий, но он говорит, что мне нужно заработать репутацию 15, прежде чем мои голоса будут публично отображаться. Сожалею. – PickenChoose