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:
intmax=128;bytem[]=newbyte[(int)"meuArquivo".length()];FileInputStreamfis=newFileInputStream("meu_arquivo");inttam_file=fis.getChannel().size();intnum_partes=tam_file/max;if((tam_file%max)!=0){num_partes++;sout("Numero de parte: "+num_partes);}for(inti=0;i<num_partes;i++){//envio dos packages}
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…
I
Iago_Nogueira
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.
InputStreamentrada=/* seu arquivo de origem */;OutputStream[]saidas=/* seus arquivos de saída */;intsaida=0;byte[]buffer=newbyte[128];for(intlidos=-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.
I
Solucao aceita
Iago_Nogueira
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:
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 !