A segmentação e a fusão de arquivos são um requisito comum. Por exemplo: Ao fazer o upload de arquivos grandes, eles podem ser divididos em pequenos pedaços primeiro e depois transferidos para o servidor antes de se fundir. Em muitos sistemas de arquivos distribuídos de ponta (como o GFS do Google e o TFS do Taobao), os arquivos também são divididos ou mesclados de acordo com as unidades de bloco.
Dê uma olhada nas idéias básicas:
Se houver um arquivo grande, especifique o tamanho da divisão (por exemplo: corte por 1m)
Etapa 1:
Primeiro, calcule o número de arquivos pequenos que finalmente são divididos com base no tamanho original do arquivo e no tamanho da segmentação.
Etapa 2:
Crie esses n pequenos arquivos no disco
Etapa 3:
Abra vários threads (número de threads = número de arquivos divididos). Em cada encadeamento, use a função de busca do RandomAccessFile para localizar o ponteiro de leitura para a primeira posição de cada segmento no arquivo original e, em seguida, leia o tamanho especificado para trás (ou seja, o tamanho do bloco segmentado) e, finalmente, escreva o arquivo dividido correspondente. Como o processo de vários threads em paralelo, cada um escreve seu próprio arquivo pequeno, que é relativamente rápido.
O código a seguir é dividir um arquivo em vários subfiles, cada um com um tamanho de 100k
pacote testio; importar java.io.file; importar java.io.fileInputStream; importar java.io.fileOutputStream; importar java.util.arils; public class substram {public static void main (string [] args) {// leia o arquivo de origem no primeiro intsize = 100*1024; File ("f: /test/test.txt"); // crie um arquivo splitfile de objeto (srcfile, cadaSize);} public static void splitfile (arquivo srcfile, int e cadasize) {// determinar o arquivo atende os requisitos de split se (srcfile.LELTE) {// 0) {/0). requisitos ");} byte [] FileContent = novo byte [(int) srcfile.length ()]; tente {// Leia o conteúdo do arquivo no arquivo de memória FILIPTREAM FIS = new FileInputStream (srcfile); fis.read (FileContent); fis.track ();} Catch (}; ser dividido no número do arquivo; if (FileContent.Length%cadaSize == 0) {filenumber = FileContent.Length/cadaSize;} else {filenumber = FileContent.Length/cadaSize+1;} para (int i = 0; i <filoNumber; i ++) {string filename = sr sr; fi = novo arquivo (srcfile.getParent (), nome do arquivo); // Crie um arquivo dividido sob o caminho do arquivo atual byte [] cadaContent; // copie o arquivo de origem conteúdos no arquivo split if (i! Arrays.copyOfRange(fileContent, eachSize*i, fileContent.length);}try {FileOutputStream fos = new FileOutputStream(fi);fos.write(eachContent);fos.close();System.out.printf("Output subfile %s, whose size is %d, each size is %d/n ", fi.getabsolutefile (), fi.length (), cadacontent.length);} catch (Exceção e) {// TODO: lide a exceção ePrintStackTrace ();}}}}Resumir
O exposto acima é o conteúdo inteiro deste artigo sobre a divisão de um arquivo em vários exemplos de código de subfili. Espero que seja útil para todos. Amigos interessados podem continuar se referindo a outros tópicos relacionados neste site. Se houver alguma falha, deixe uma mensagem para apontá -la. Obrigado amigos pelo seu apoio para este site!