Un grand lot de données était nécessaire il y a quelque temps. DBA a fourni des fichiers CVS, mais chaque fichier CVS est de plusieurs GB, il est donc chargé directement. La base de données est très lente et provoquera une mémoire insuffisante. Afin de réaliser cette fonction, un programme pour diviser rapidement des fichiers a été écrit.
import org.apache.log4j.logmanager; import org.apache.log4j.logger; import java.io. *; import java.util. *; import java.util.concurrent. *; classe publique filesplututil {private final static logger log = logManager.getLogger (filesplututil.class); Finale statique privée Long OriginfileSize = 1024 * 1024 * 100; // 100m Static Final Static Final FinalFileSize = 1024 * 1024 * 64; // Pour empêcher le chinois brouillé chinois, vous devez prendre 2 à la puissance N Power / ** * Cvs Fichier séparateur * / Private Static Final char CvSseparator = '^'; public static void main (String args []) {long start = System.currenttimemillis (); essayez {string filename = "d: //csvtest//aa.csv"; Fichier sourcefile = nouveau fichier (nom de fichier); if (sourcefile.length ()> = originfileSize) {String cvsFileName = filename.replaceAll ("////", "/"); Filesplutil filesplitutil = new filesplututil (); List <string> party = filesplututil.splitBysize (cvsFileName, blockFileSize); for (String Part: Parts) {System.out.println ("PartName est:" + pièce); }} System.out.println ("Longueur du fichier total" + sourceFile.length () + ", temps pour diviser le fichier:" + (System.Currenttimemillis () - Démarrer) + "MS."); } catch (exception e) {log.info (e.getStackTrace ()); }} / ** * Fichier divisé * * @param Nom de fichier Le nom complet du fichier à répartir * @param byTesize Split par combien d'octets * @return Liste des noms de fichiers divisés * / Liste publique <string> SplitBySize (String FileName, int ByTesize) lance ioException, InterruptedException {List <String> Parts = New ArrayList <stRatt> (); Fichier fichier = nouveau fichier (nom de fichier); int count = (int) math.ceil (file.length () / (double) byTesize); int countlen = (count + "") .length (); RandomAccessFile RAF = nouveau RandomAccessFile (nom de fichier, "R"); long totallen = raf.length (); CountdownLatch Latch = new CountdownLatch (Count); pour (int i = 0; i <count; i ++) {String partfileName = file.getPath () + "." + LeftPad ((i + 1) + "", countlen, '0') + ".cvs"; int lireSize = byTesize; long startPos = (long) i * byTesize; long nextpos = (long) (i + 1) * bytesize; if (nextpos> totallen) {readSize = (int) (totallen-startpos); } new SplitRunnable (ReadSize, startPos, partfilename, fichier, latch) .run (); Parties.Add (PartFileName); } latch.await (); // attendant que tous les fichiers soient écrits // les lignes peuvent être coupées pendant la coupe, et tous les fichiers divisés peuvent être traités, Mergerow (parties); pièces de retour; } / ** * Traitement du segment Runnable * * @Author Supeidong * / classe privée SplitRunnable implémente Runnable {int bytesize; String partfileName; Fichier Originfile; Long StartPos; CountdownLatch Latch; Public SplitRunnable (int bytesize, long startPOS, String PartFileName, fichier Originfile, CountdownLatch Latch) {this.startpos = startpos; this.ByTesize = byTesize; this.partFileName = partfilename; this.originfile = originfile; this.latch = latch; } public void run () {randomaccessfile rfile; OutStstream OS; essayez {rFile = new RandomAccessFile (Originfile, "R"); octet [] b = nouveau octet [bytesize]; rfile.seek (startPos); // déplace le pointeur vers le début de chaque "segment" int s = rfile.read (b); OS = new FileOutputStream (PartFileName); OS.Write (B, 0, S); os.flush (); os.close (); latch.CountDown (); } catch (ioException e) {log.Error (e.getMessage ()); latch.CountDown (); }}} / ** * Fusiner les lignes de coupe * * @param parties * / private void mergerow (list <string> parties) {list <partFile> PartsFiles = new ArrayList <partFile> (); essayez {// assemblez l'objet Table Split pour (int i = 0; i <part.size (); i ++) {String partfileName = part.get (i); Fichier SplitFileTemp = nouveau fichier (PartFileName); if (SplitFileTemp.Exists ()) {PartFile PartFile = new PartFile (); BufferedReader Reader = new BufferedReader (new InputStreamReader (new FileInputStream (SplitFileTemp), "GBK")); String firStrow = Reader.Readline (); String secondRow = Reader.Readline (); String Endrow = ReadLastLine (PartFileName); PartFile.SetPartFileName (PartFileName); PartFile.setFirStrow (FIRSTROW); PartFile.setendRow (Endrow); if (i> = 1) {String pretartfile = part.get (i - 1); String preendRow = readLastLine (pretAtFile); PartFile.setFirstisfull (getCacte (firstrow + preendrow)> getConpount (secondrow)); } partfiles.add (partfile); Reader.Close (); }} // Écrivez les lignes qui doivent être fusionnées pour (int i = 0; i <partfiles.size () - 1; i ++) {partfile partfile = partfiles.get (i); PartFile PartFileNExt = PartFiles.get (i + 1); StringBuilder sb = new StringBuilder (); if (partfilenext.getFirstisfull ()) {sb.append ("/ r / n"); SB.APPEND (PartFileNext.getFirStrow ()); } else {sb.append (partfilenext.getFirStrow ()); } writeLastline (partfile.getPartFileName (), sb.toString ()); }} catch (exception e) {log.error (e.getMessage ()); }} / ** * Obtenez le nombre de fois qu'un caractère apparaît * @param s * @return * / private int getCaunt (String S) {int count = 0; for (int i = 0; i <s.Length (); i ++) {if (s.Carat (i) == cvSSeparator) {count ++; }} Return Count; } / ** * Utilisez BufferedInputStream pour lire le nombre de lignes de fichiers * * @param filename * @return * / public int getFilerow (String filename) lève ioException {inputStream is = new BufferedInputStream (new FileInputStream (filename)); octet [] c = nouveau octet [1024]; int count = 0; int liadchars = 0; while ((readchars = is.read (c))! = -1) {for (int i = 0; i <readchars; ++ i) {if (c [i] == '/ n') ++ count; }} is.close (); Return Count; } / ** * Lire la dernière ligne de données * @param filename * @return * @throws ioException * / private String readlastline (String FileName) lève ioException {// Utiliser RandomAccessFile, trouver la dernière ligne de données derrière RandomAccessFile Raf = new RandomAccessFile (fichier, "r"); long len = raf.length (); String lastline = ""; if (len! = 0l) {long pos = len - 1; while (pos> 0) {pos--; raf.seek (pos); if (raf.readbyte () == '/ n') {lastline = raf.readline (); lastline = new String (lastline.getBytes ("8859_1"), "gbk"); casser; }}}} raf.close (); retourner Lastline; } / ** * Modifiez la dernière ligne de données * @param nom de fichier * @param laststring * @return * @throws ioException * / private void writeLastline (String FileName, String Laststring) {try {// Ouvrir un flux de fichiers d'accès aléatoire et lire et écrire selon la méthode Read and Write RandomAccessFile; // longueur de fichier, nombre d'octets longs fileLength = randomfile.length (); // Déplacez le pointeur d'écriture vers la fin du fichier. randomfile.seek (fileLength); // GBK doit être ajouté ici, sinon BRADBLEBLE RABLAMSFILE.WRITE (LASTSTRING.GETBYTES ("GBK")); randomfile.close (); } catch (ioException e) {log.Error (e.getMessage ()); }} / ** * Left Film * * @param str * @param longueur * @param ch * @return * / public static String LeftPad (String str, int Longe, char ch) {if (str.length ()> = longueur) {return str; } char [] chs = new char [longueur]; Arrays.filt (CHS, CH); char [] src = str.tocharArray (); System.ArrayCopy (Src, 0, CHS, Longueur - Src.Length, Src.Length); retourner la nouvelle chaîne (CHS); } / ** * Merge File Line Classe interne * / class partfile {private String PartFileName; String privé FIRSTROW; Endrow de chaîne privée; Boolean privé Firstistisfull; public String getPartFileName () {return partfileName; } public void setPartFileName (String partfileName) {this.partFileName = partfilename; } public String getFirStrow () {return firstrow; } public void setFirStrow (string firstrow) {this.firStrow = firStrow; } public String getEndrow () {return Endrow; } public void setenDrow (String Endrow) {this.endRow = Endrow; } public boolean getFirstisfull () {return firstisfull; } public void setFirstisfull (booléen firstisfull) {this.firstisfull = firstisfull; }}}Ce qui précède concerne cet article, j'espère qu'il sera utile pour tout le monde d'apprendre la programmation Java.