La segmentation et la fusion des fichiers sont une exigence commune. Par exemple: lors du téléchargement de fichiers volumineux, ils peuvent d'abord être divisés en petits pièces, puis transférés sur le serveur avant la fusion. Dans de nombreux systèmes de fichiers distribués haut de gamme (tels que le GFS de Google et les TFS de Taobao), les fichiers sont également divisés ou fusionnés en fonction des unités de bloc.
Jetez un œil aux idées de base:
S'il y a un grand fichier, spécifiez la taille divisée (par exemple: coupez par 1m)
Étape 1:
Tout d'abord, calculez le nombre de petits fichiers qui sont finalement divisés en fonction de la taille d'origine du fichier et de la taille de segmentation.
Étape 2:
Créer ces n petits fichiers sur disque
Étape 3:
Ouvrez plusieurs threads (nombre de threads = nombre de fichiers fendus). Dans chaque thread, utilisez la fonction de recherche de RandomAccessFile pour localiser le pointeur de lecture vers la première position de chaque segment du fichier d'origine, puis lisez la taille spécifiée vers l'arrière (c'est-à-dire la taille du bloc segmenté), et enfin écrivez le fichier fendu correspondant. Étant donné que le traitement multi-threads en parallèle, chacun écrit son propre petit fichier, ce qui est relativement rapide.
Le code suivant est de diviser un fichier en plusieurs sous-réserves, chacune avec une taille de 100k
Package Testio; Importer java.io.file; import java.io.fileInputStream; import java.io.fileoutputStream; import java.util.arrays; public class substream {public static void main (string [] args) {// lisez le fichier source dans la mémoire d'abord intacseyze = 100 * 1024; fichier srcfile = new Fichier ("F: /test/test.txt"); // Créer un fichier Object SplitFile (Srcfile, Everysize);} public static void SplitFile (Fichier Srcfile, int eorque chaque fois) {// Déterminer si le fichier répond aux exigences divisées if (Srcfile.Length fileContent = new Byte [(int) srcfile.length ()]; essayez {// lire le contenu du fichier dans la mémoire fileInputStream fis = new FileInputStream (srcfile); fis.read (fileContent); fis.close ();} catch (exception e) {e.printStackTrace ();} // Calculate fileNumber; if (fileContent.length% chaque-size == 0) {fileNumber = fileContent.length / eorgaSize;} else {fileNumber = fileContent.length / psecond + 1;} for (int i = 0; i <filember; i ++) {string filename = srcfile.getname () + "-" + i + ". File (srcfile.getparent (), nom de file Arrays.copyofrange (fileContent, chacun * i, fileContent.length);} essai % d / n ", fi.getAbsoluteFile (), fi.length (), everycontent.length);} catch (exception e) {// todo: great exception e.printstackTrace ();}}}}Résumer
Ce qui précède est l'intégralité du contenu de cet article sur la division d'un fichier en plusieurs exemples de code de sous-fichier. J'espère que ce sera utile à tout le monde. Les amis intéressés peuvent continuer à se référer à d'autres sujets connexes sur ce site. S'il y a des lacunes, veuillez laisser un message pour le signaler. Merci vos amis pour votre soutien pour ce site!