Thread para zipar em paralelo

4 respostas
javinh

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) + ")");
		}
	}

4 Respostas

KWill

É teóricamente impossível com o atual suporte ao formato zip que o Java tem, onde só é possível adicionar um “ZipEntry” por vez em um arquivo zip.
Algo que dá para fazer é criar múltiplos arquivos zip em paralelo.

Inté.

javinh

É eu tava analisando e vi que não da pra fazer mesmo, cara eu tô ferrada… já procurei de varias maneiras fazer as threads pegar varios arquivos e rodar em paralelo e nao da certo :twisted:
Lá se vao pontos a menos e reprovaçoes a mais. :evil:

Priuli

É possivel criar múltiplos arquivos zip em paralelo. Mas usar threads para zipar os arquivo em apenas um zip só
acho q ñ é possivel.

alucardeck

até onde eu sei, isso não é uma limitação do Java…
e sim do próprio SO.

crie um arquivo ZIP, arraste um arquivo ‘grande’ pra dentro dele, e enquanto está processando, arraste outro arquivo.

“O arquivo já está sendo usado por outro processo.”

pode desistir da ideia ^^

Criado 17 de março de 2011
Ultima resposta 17 de mar. de 2011
Respostas 4
Participantes 4