Вам нужно использовать левое соединение вместо внутреннего соединения
SELECT aa.eng, aa.id, bb.arb, bb.url, bb.id
FROM Arabic AS aa left JOIN English AS bb ON (aa.id = bb.id)
Используя ZipInputStream
вместо ZipFile
должен, вероятно, сделать это.
Стандарт Zip поддерживает макс. из 65 536 записей в файле. Если библиотека Java не будет поддерживать расширения ZIP64, она не будет работать правильно, при попытке считать или записать архив с 74 000 записей.
Использование apache IOUtils:
FileInputStream fin = new FileInputStream(zip);
ZipInputStream zin = new ZipInputStream(fin);
ZipEntry ze = null;
while ((ze = zin.getNextEntry()) != null) {
FileOutputStream fout = new FileOutputStream(new File(
outputDirectory, ze.getName()));
IOUtils.copy(zin, fout);
IOUtils.closeQuietly(fout);
zin.closeEntry();
}
IOUtils.closeQuietly(zin);
Я переработал метод, чтобы сделать структуру каталогов более удобной и заархивировать сразу целую кучу целей. Простые файлы будут добавлены в корень zip-файла, если вы передадите каталог, основная структура будет сохранена.
def zip (String zipFile, String [] filesToZip){
def result = new ZipOutputStream(new FileOutputStream(zipFile))
result.withStream { zipOutStream ->
filesToZip.each {fileToZip ->
ftz = new File(fileToZip)
if(ftz.isDirectory()){
pathlength = new File(ftz.absolutePath).parentFile.absolutePath.size()
ftz.eachFileRecurse {f ->
if(!f.isDirectory()) writeZipEntry(f, zipOutStream, f.absolutePath[pathlength..-1])
}
}
else writeZipEntry(ftz, zipOutStream, '')
}
}
}
def writeZipEntry(File plainFile, ZipOutputStream zipOutStream, String path) {
zipOutStream.putNextEntry(new ZipEntry(path+plainFile.name))
new FileInputStream(plainFile).withStream { inStream ->
def buffer = new byte[1024]
def count
while((count = inStream.read(buffer, 0, 1024)) != -1)
zipOutStream.write(buffer)
}
zipOutStream.closeEntry()
}