Java: Dividindo e recuperando arquivos binários

Me enviaram um questionamento a respeito de divisão de arquivos binários.

Post Original:
http://www.byiorio.com/wordpress/2012/03/27/dividir-arquivo-texto-por-tamanho-no-java/

Pergunta:
“É possível dividir e recuperar um arquivo binário?”

Resposta:
Sim com certeza. Além disso podemos fazer vários tratamentos, distribuições de arquivos, compressão etc..

Para efeito de teste e estudo, segue um exemplo bem simples de como juntar o conteúdo dividido:

Lembrando que temos que levar em conta alguns fatores:
1) O nome do arquivo não pode ter mais que um “.” (PONTO);
2) O nome padrão dos arquivos divididos será: nome original adicionando “_” e o número sequencial da divisão;
Exemplo:
– teste_0.docx
– teste_1.docx
– teste_2.docx
3) O arquivo será recuperado no nome: nome original adicionando a palavra “_original”;
Exemplo
– teste_original.docx

Para ser usado em larga escala ou profissionalmente eu recomendaria:

0) Zipar o arquivo a ser repartido

Criar um TXT com o sumário de tudo que foi feito para ser usado na recuperação do arquivo:
1) Tamanho;
2) Quantidade de arquivos;
3) Nomes dos arquivos;
4) Data que foi feito a separação;
5) Tamanho que foi selecionado para divisão;
etc..

Cuidado adicional
6) Fazer tratamento e checagens adicionais para testar o arquivo antes e após divisão;

Armazenar arquivo é algo muito sério.

import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;

public class FileSplitter {
	public static void main(String[] args) throws Exception {
		// Criando classe
		FileSplitter split = new FileSplitter("teste.docx");

		// Dividindo por tamanho de 1MB
		split.splitByMB(1);

		// Recupera divisão no arquivo teste_original.docx
		split.joinFile();

	}

	String fileName;
	public static int BASE = 1024, KB = BASE, MB = KB * BASE, GB = MB * BASE;

	public FileSplitter(String fileName) {
		this.fileName = fileName;
	}

	public void joinFile() {
		byte buffer[] = new byte[MB];
		int read = 0;
		FileOutputStream fos = null;
		FileInputStream fis = null;

		try {
			int i = 0;

			// Enquanto encontrar arquivos no padrão juntar conteudo
			while (i > -1) {
				// Recupera nome original
				String start = this.fileName.substring(0, this.fileName.indexOf("."));
				String end = this.fileName.substring(this.fileName.lastIndexOf("."), this.fileName.length());

				// Instancia arquivo
				String fileSp = start + "_" + i + end;
				File f = new File(fileSp);

				// Se existir escreve no original
				if (f.exists()) {
					System.out.println("Encontrado arquivo " + fileSp);

					// Se encontrou 1 arquivo gera o original
					if (i == 0) {
						fos = new FileOutputStream(start + "_original" + end);
					}

					// Le arquivo
					fis = new FileInputStream(fileSp);

					// Escreve conteudo do arquivo lido dentro do arquivo
					// original
					while ((read = fis.read(buffer)) != -1) {
						fos.write(buffer, 0, read);
						fos.flush();
					}

					fis.close();

					// Pega proximo arquivo
					i++;
				} else {
					// Se não existir arquivo sai do loop
					i = -1;
					break;
				}

			}

		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			try {
				if (fos != null)
					fos.close();
			} catch (IOException e) {

			}
			try {
				if (fis != null)
					fis.close();
			} catch (IOException e) {

			}
		}

	}

	public void splitByMB(int splitSize) throws Exception {
		// checando parametro
		if (splitSize < 1 || splitSize > 500) {
			throw new Exception("Tamanho a ser dividido deve estar entre 1MB e 500MB");
		}
		// TRansforma em MB
		splitSize = splitSize * MB;
		// Variavel para escrever arquivo
		FileOutputStream fos = null;
		// Arquivo a ser lido
		FileInputStream fis = new FileInputStream(this.fileName);
		// Tamanho do buffer 1MB para acertar na conta do split por MB
		byte buffer[] = new byte[MB];
		try {
			int read = 0, count = 0, readBuffer = 0;
			// Enquanto tiver algo para ler
			while ((read = fis.read(buffer)) != -1) {
				// Gerar novo arquivo de OUTPUT
				if (readBuffer == 0) {
					// Gera novo nome
					String start = this.fileName.substring(0, this.fileName.indexOf("."));
					String end = this.fileName.substring(this.fileName.lastIndexOf("."), this.fileName.length());
					fos = new FileOutputStream(start + "_" + count + end);
				}
				// Somma buffer lido
				readBuffer += read;
				// Escreve no arquivo
				fos.write(buffer, 0, read);
				fos.flush();
				// Se atingir o limite solicitado, criar um novo arquivo
				if (readBuffer >= splitSize) {
					// Zera buffer para criar outro file
					readBuffer = 0;
					// Coloca outro numero para o file
					++count;
					// fecha leitura do file anterior
					fos.close();
				}
			}
		} finally {
			// Se tiver aberto fecha
			try {
				if (fos != null)
					fos.close();
			} catch (IOException e) {

			}
			try {
				if (fis != null)
					fis.close();
			} catch (IOException e) {

			}
		}
	}

}

Deixe uma resposta

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *

Blue Captcha Image
Atualizar

*

Facebook

Get the Facebook Likebox Slider Pro for WordPress
WordPress SEO fine-tune by Meta SEO Pack from Poradnik Webmastera