English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

Esempio di codice per dividere un file in più sottofile con il flusso di input/output Java

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.

Ti potrebbe interessare