Em Java:
Preciso quebrar um File (.txt, .pdf, .mp3…) em algumas partições para depois poder enviar para um cliente. (Estou usando sockets e conexões cliente-servidor). Alguem sabe como fazer isso da melhor forma ?
Code:
int max = 128;
byte m[] = new byte[(int)"meuArquivo".length()];
FileInputStream fis = new FileInputStream("meu_arquivo");
int tam_file = fis.getChannel().size();
int num_partes = tam_file/max;
if ( (tam_file % max) != 0 ) {
num_partes++;
sout( "Numero de parte: " + num_partes );
}
for ( int i = 0; i < num_partes; i++ ) {
//envio dos packages
}
Ola,
pq vc quer quebrar em partes para enviar?
Esse trabalho funciona como uma radio mp3. Aqui vão as especeficações
Cada estação terá somente uma canção. Estação 0 toca o arquivo 1, estação 1 o arquivo 2, etc.
Cada estação deve tocar o arquivo em loop infinito. Quando o servidor inicia, ele deve escutar por conexões. Quando um cliente conecta, deve interagir de acordo com a especificação do protocolo. Adicionalmente, ele deve enviar um Announce toda vez que a canção repetir.
Você quer servir um fluxo de canções, não envia-la o mais rápido possível. Assuma que suas músicas são arquivos mp3 de 128kbps, o que significa que o servidor deve enviar os dados a taxa de 128Kibps (16KiB/s).
• O servidor deve suportar múltiplos clientes, simultaneamente.
• Não deve limitar o número de estações, nem de clientes por estação.
• O servidor não deve cair, mesmo quando clientes se comportam erroneamente.
• Se múltiplos clientes estão conectados a mesma estação, eles devem escutar a mesma parte
da canção, mesmo se conectaram em tempos distintos.
• Se nenhum cliente está conectado a uma estação, a posição corrente da canção deve atua-lizar, mesmo sem enviar dados.
Com ajuda de um software, consegui quebrar o arquivo determinando os cortes pelo segundos, mas não deu muito certo, o numero de partes varia de musica para musica ja que eu não posso garantir que o tempo de duração de uma musica é exatamente igual a outra…
Achei um tópico que faz uma grande parte do que procuro, pelo que entendi, o código abaixo transforma um arquivo qualquer em um array de bytes… O que quero é uma forma de subdividir esse array em outros de tamanho 128 por exemplo.
@jaireltonPJ
File arq = new File("c:/arquivo.txt");
ByteArrayOutputStream out = new ByteArrayOutputStream();
FileInputStream in = new FileInputStream(arq);
int b;
while((b = in.read())>-1){
out.write(b);
}
out.close();
in.close();
byte[] array = out.toByteArray();
Pode se basear no pseudo-código abaixo:
InputStream entrada = /* seu arquivo de origem */;
OutputStream[] saidas = /* seus arquivos de saída */;
int saida = 0;
byte[] buffer = new byte[128];
for (int lidos = -1; (lidos = entrada.read(buffer)) != -1; saidas[saida++].write(buffer, 0, lidos)) {}
Dica:
Ler ou gravar somente 128 bytes é um desperdício pois o hardware lê ou escreve em blocos de 4096 ou 8192 bytes, depende do tamanho do cluster do disco.
Então evite fazer assim:
while ((b = in.read()) != 1) {
out.write(b);
}
Eu costumo usar buffers de 8192 bytes.
Cara, cheguei a implementar o código acima mas não funcionou do jeito que eu gostaria… Enfim, depois de um tempo eu cheguei a resposta:
FileInputStream fis = new FileInputStream( "meu_arquivo" );
int cont;
byte[] particao = new byte[50000];
while ( ( cont = fis.read( particao ) ) > -1 )
mList.add( particao );
O código acima basicamente pega um arquivo qualquer, o-divide em partições de 50kb, e armazena em um ArrayList. É isso, valeu a todo mundo que respondeu !