English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
Divisão e combinação de arquivos é uma necessidade comum, por exemplo: ao enviar grandes arquivos, pode-se dividir primeiro em pequenos blocos, enviar para o servidor e então combiná-los. Muitos sistemas de arquivos distribuídos de alta qualidade (como o GFS do Google, o TFS do Taobao) também dividem ou combinam arquivos em unidades de bloco.
Veja a ideia básica:
Se houver um grande arquivo, após especificar o tamanho de divisão (por exemplo, por1Corte M)
passo 1:
Primeiro, baseado no tamanho do arquivo original e no tamanho de divisão, calcule o número final de arquivos divididos N
passo 2:
Cria esses N pequenos arquivos no disco
passo 3:
Abre várias threads (número de threads = número de arquivos divididos), em cada thread, usa a função seek do RandomAccessFile para posicionar o ponteiro de leitura na posição inicial de cada seção do arquivo original, e então ler o tamanho especificado para frente (ou seja, o tamanho do bloco de divisão), finalmente escrevendo no arquivo dividido correspondente, porque o processamento paralelo de várias threads, cada uma escreve seus próprios pequenos arquivos, a velocidade é relativamente rápida.
O código a seguir é para dividir um arquivo em vários arquivos filhos, cada um com tamanho100K
package testIO; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.util.Arrays; public class subStream { public static void main(String[] args) { //Primeiro, leia o arquivo-fonte para a memória int eachSize=100*1024; File srcFile =new File("F:",/test/test.txt"); //Criar um objeto arquivo splitFile(srcFile,eachSize); } public static void splitFile(File srcFile,int eachSize){ //Verificar se o arquivo atende aos requisitos de divisão if(srcFile.length()==0){ throw new RuntimeException("O arquivo não atende aos requisitos de divisão"); } byte[] fileContent= new byte[(int) srcFile.length()]; try { //Ler o conteúdo do arquivo para a memória FileInputStream fis=new FileInputStream(srcFile); fis.read(fileContent); fis.close(); } catch (Exception e) { e.printStackTrace(); } //Calcular quantas partes precisam ser divididas int fileNumber; if(fileContent.length%eachSize==0){ fileNumber = fileContent.length/eachSize; } else{ fileNumber = fileContent.length/eachSize+1; } for (int i=0;i<fileNumber;i++){ String fileName = srcFile.getName()+"-"+i+".txt"; File fi = new File(srcFile.getParent(), fileName); //Criar o arquivo dividido na pasta de caminho atual byte[] eachContent; //Copiar o conteúdo do arquivo original para os arquivos divididos if(i!=fileNumber-1){ eachContent = Arrays.copyOfRange(fileContent, eachSize*i, eachSize*(i+1)); } else{ eachContent = Arrays.copyOfRange(fileContent, eachSize*i, fileContent.length); } try { FileOutputStream fos = new FileOutputStream(fi); fos.write(eachContent); fos.close(); System.out.printf("Saída do subarquivo %s, seu tamanho é %d, cada um é %d\n", fi.getAbsoluteFile(), fi.length(), eachContent.length); } catch (Exception e) { // TODO: lidar com exceção e.printStackTrace(); } } } }
Resumo
Isso é tudo sobre o exemplo de código de Java IO para dividir um arquivo em vários arquivos filhos. Espero que ajude. Amigos interessados podem continuar a ler outros tópicos relacionados neste site, e são bem-vindos a deixar sugestões. Agradecemos o apoio dos amigos ao site!
Declaração: O conteúdo deste artigo é de origem na internet, pertence ao respectivo detentor dos direitos autorais, foi submetido e carregado voluntariamente pelos usuários da internet, este site não possui direitos de propriedade, não foi editado manualmente e não assume responsabilidade por questões legais relacionadas. Se você encontrar conteúdo suspeito de violação de direitos autorais, por favor, envie um e-mail para: notice#oldtoolbag.com (ao enviar e-mail, substitua # por @ para denunciar e forneça provas relevantes. Apenas ao confirmar, o site deletará imediatamente o conteúdo suspeito de violação de direitos autorais.)