English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
La division et la fusion de fichiers est une exigence courante, par exemple : lors de l'envoi de fichiers volumineux, il est possible de les diviser en petits morceaux, les télécharger sur le serveur et ensuite les fusionner. De nombreux systèmes de fichiers distribués avancés (comme : GFS de Google, TFS de Taobao) divisent ou fusionnent les fichiers par bloc.
Voyons les idées de base :
Si il y a un grand fichier, après avoir spécifié la taille de division (par exemple : selon1M coupes)
étape 1:
D'abord, selon la taille du fichier original et la taille de division, calculer le nombre final de fichiers divisés N.
étape 2:
Créer ces N petits fichiers sur le disque.
étape 3:
Ouvrir plusieurs threads (le nombre de threads = le nombre de fichiers divisés), dans chaque thread, utiliser la fonction seek de RandomAccessFile pour positionner le pointeur de lecture à la position de début de chaque segment dans le fichier original, puis lire en avant la taille spécifiée (c'est-à-dire : la taille du bloc de division), écrire finalement dans le fichier de division correspondant, car le traitement par threads parallèles, chaque thread écrit dans un petit fichier différent, la vitesse est relativement rapide.
Le code suivant divise un fichier en plusieurs fichiers enfants, chaque taille est100K
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) { //Lire d'abord le fichier source dans la mémoire int eachSize=100*1024; File srcFile =new File("F:\"/test/test.txt"); //Créer un objet fichier splitFile(srcFile,eachSize); } public static void splitFile(File srcFile,int eachSize){ //Vérifier si le fichier correspond aux exigences de division if(srcFile.length()==0){ lancer une nouvelle RuntimeException("Le fichier ne correspond pas aux exigences de division"); } byte[] fileContent= new byte[(int) srcFile.length()]; try { //Lire le contenu du fichier dans la mémoire FileInputStream fis=new FileInputStream(srcFile); fis.read(fileContent); fis.close(); } catch (Exception e) { e.printStackTrace(); } //Calculer le nombre de parties à diviser 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); //Créer un fichier divisé dans le répertoire de fichier actuel byte[] eachContent; //Copier le contenu du fichier source dans le fichier divisé 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("Sortie du sous-fichier %s, sa taille est %d, chaque taille est %d\n", fi.getAbsoluteFile(), fi.length(), eachContent.length); } catch (Exception e) { // TODO : gérer l'exception e.printStackTrace(); } } } }
Résumé
Voici la totalité du contenu de cet article sur l'exemple de code pour diviser un fichier en plusieurs sous-fichiers en utilisant le flux IO java, j'espère que cela pourra aider tout le monde. Les amis intéressés peuvent continuer à consulter d'autres sujets pertinents sur ce site, et les amis sont invités à laisser des messages pour indiquer des insuffisances. Merci de l'appui de vos amis à ce site !
Déclaration : le contenu de cet article est tiré du réseau, et les droits d'auteur appartiennent aux propriétaires respectifs. Le contenu est contribué et téléchargé par les utilisateurs d'Internet. Ce site ne détient pas de droits de propriété, n'a pas été édité par l'homme, et n'assume aucune responsabilité juridique. Si vous trouvez du contenu suspect de violation de droits d'auteur, vous êtes invité à envoyer un e-mail à : notice#oldtoolbag.com (au moment de l'envoi d'un e-mail, veuillez remplacer # par @ pour faire une plainte, et fournir des preuves pertinentes. Une fois vérifié, ce site supprimera immédiatement le contenu suspect de violation de droits d'auteur.)