English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
La segmentazione e la fusione dei file è una esigenza comune, ad esempio: quando si caricano file grandi, è possibile dividerli in piccoli pezzi, inviarli al server e poi riunirli. Molti sistemi di file distribuiti di alto livello (ad esempio: GFS di Google, TFS di Taobao) segmentano o fondono i file in base a block.
Ecco il principio di base:
Se c'è un file grande, dopo aver specificato la dimensione di segmentazione (ad esempio: tagliare per 1M)
Passo 1:
Prima, basati sulla dimensione del file originale e sulla dimensione di segmentazione, calcola il numero finale di file di segmentazione N
Passo 2:
Crea questi N file di segmentazione sul disco
Passo 3:
Apri più thread (numero di thread = numero di file di segmentazione), in ogni thread, utilizza la funzione seek di RandomAccessFile per posizionare il puntatore di lettura alla posizione iniziale di ogni segmento del file originale, quindi legge in avanti la dimensione specificata (cioè: la dimensione del blocco di segmentazione) e scrive nel file di segmentazione corrispondente. Poiché il trattamento parallelo multi-thread è utilizzato, ciascuno scrive nei propri file di segmentazione, il tasso di velocità è relativamente piuttosto veloce.
Il seguente codice divide un file in più file di sottoinsieme, con una dimensione di ogni file di 100K
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) { //Leggi prima il file sorgente nella memoria int eachSize=100*1024; File srcFile =new File("F:/test/test.txt"); //Crea un'istanza di file splitFile(srcFile,eachSize); } public static void splitFile(File srcFile,int eachSize){ //Verifica se il file soddisfa i requisiti di divisione if(srcFile.length()==0){ throw new RuntimeException("Il file non soddisfa i requisiti di divisione"); } byte[] fileContent= new byte[(int) srcFile.length()]; try { //Leggi il contenuto del file nella memoria FileInputStream fis=new FileInputStream(srcFile); fis.read(fileContent); fis.close(); } catch (Exception e) { e.printStackTrace(); } //Calcola quante parti deve essere diviso il file 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); //Crea il file diviso nella directory corrente byte[] eachContent; //Copia il contenuto del file sorgente nei file divisi 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("Output del sottofile %s, la sua dimensione è %d, ogni dimensione è %d\n", fi.getAbsoluteFile(), fi.length(), eachContent.length); } catch (Exception e) { // TODO: gestire l'eccezione e.printStackTrace(); } } } }
Sommario
Questo è tutto il contenuto dell'esempio di codice di questo articolo su come dividere un file in più sottoscrizioni di file di output di flusso IO Java, spero sia utile a tutti. Chi è interessato può continuare a leggere altri argomenti correlati su questo sito, e se c'è qualcosa di insufficiente, è benvenuto a lasciare un messaggio. Grazie per il supporto degli amici di questo sito!
Dichiarazione: il contenuto di questo articolo è stato tratto da Internet, è di proprietà dei rispettivi autori, il contenuto è stato contribuito e caricato autonomamente dagli utenti di Internet, questo sito non detiene i diritti di proprietà, non è stato editato manualmente e non assume alcuna responsabilità legale. Se trovi contenuti sospetti di violazione del copyright, invia un'e-mail a: notice#oldtoolbag.com (al momento dell'invio dell'e-mail, sostituisci # con @) per segnalare il problema e fornire prove pertinenti. Una volta verificata, questo sito eliminerà immediatamente il contenuto sospetto di violazione del copyright.