Bom dia! Pessoal eu tenho esse codigo aqui que zipa arquivos ou pastas completas mas zipa sequencial e ta rodando beleza. Gostaria de saber como eu faço pra colocar threads no codigo para que os arquivos sejam zipados paralelamente? Não estou conseguindo fazer, por favor uma ajudinha!! :roll:
Fiz uma classe Compactar Paralelo e Uma para zipar, mas não ta dando certo, fica repetindo e nao para. O que eu faço??? :oops:
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import java.util.zip.ZipEntry;
import java.util.zip.ZipOutputStream;
public class ZipDirectory implements Runnable {
private String nomeArquivo;
public ZipDirectory(String nomeArquivo) {
this.nomeArquivo = nomeArquivo;
}
public void run() {
long fim = System.currentTimeMillis();
long inicio = System.currentTimeMillis();
File directoryToZip = new File(nomeArquivo);
List<File> fileList = new ArrayList<File>();
getAllFiles(directoryToZip, fileList);
System.out.println("---Criando o zip");
writeZipFile(directoryToZip, fileList);
System.out.println("---Feito");
fim = System.currentTimeMillis();
System.out.println("Final");
System.out.println("tempo final: " + Compactador.exibeEmHoras(fim - inicio) + "("
+ (fim - inicio) + ")");
}
public static void getAllFiles(File dir, List<File> fileList) {
try {
File[] files = dir.listFiles();
for (File file : files) {
fileList.add(file);
if (file.isDirectory()) {
System.out.println("Diretorio:" + file.getCanonicalPath());
getAllFiles(file, fileList);
} else {
System.out.println(" Arquivo:" + file.getCanonicalPath());
}
}
} catch (IOException e) {
e.printStackTrace();
}
}
public static void writeZipFile(File directoryToZip, List<File> fileList) {
try {
FileOutputStream fos = new FileOutputStream(directoryToZip.getName() + ".zip");
ZipOutputStream zos = new ZipOutputStream(fos);
for (File file : fileList) {
if (!file.isDirectory()) { // apenas arquivos, nao diretorios
addToZip(directoryToZip, file, zos);
}
}
zos.close();
fos.close();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
public static void addToZip(File directoryToZip, File file, ZipOutputStream zos) throws FileNotFoundException,
IOException {
FileInputStream fis = new FileInputStream(file);
String zipFilePath = file.getCanonicalPath().substring(directoryToZip.getCanonicalPath().length() + 1,
file.getCanonicalPath().length());
System.out.println("Escrevendo '" + zipFilePath + "' to zip file");
ZipEntry zipEntry = new ZipEntry(zipFilePath);
zos.putNextEntry(zipEntry);
byte[] bytes = new byte[1024];
int length;
while ((length = fis.read(bytes)) >= 0) {
zos.write(bytes, 0, length);
}
zos.closeEntry();
fis.close();
}
}
import java.io.File;
import java.io.IOException;
public class CompactadorPararlelo1 {
public static void main(String[] args) throws IOException {
long endTime, initTime = System.currentTimeMillis();
File directoryToZip = new File("C:\Users\workspace\zipar\stuff");
Thread[] threads = new Thread[directoryToZip.getCanonicalPath().length()];
String nomeArquivo;
for (int i = 0; i < directoryToZip.length(); i++) {
nomeArquivo = directoryToZip.getCanonicalPath().toString();
threads[i] = new Thread(new ZipDirectory(nomeArquivo));
threads[i].start();
}
for (Thread thread : threads) {
try {
thread.join();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
System.out.println("Arquivos compactados com sucesso.");
endTime = System.currentTimeMillis();
System.out.println("FINALIZADO.");
System.out.println("Tempo final decorrido: "
+ Compactador.exibeEmHoras(endTime - initTime) + "("
+ (endTime - initTime) + ")");
}
}