Vor einiger Zeit war eine große Menge Daten erforderlich. DBA stellte CVS -Dateien bereit, aber jede CVS -Datei hat eine Größe von mehreren GB, sodass sie direkt geladen wird. Die Datenbank ist sehr langsam und führt zu einem unzureichenden Speicher. Um diese Funktion zu erkennen, wurde ein Programm zum schnellen Teil von Dateien geschrieben.
import org.apache.log4j.logmanager; import org.apache.log4j.logger; Java.io importieren.*; import Java.util.*; import Java.util.Concurrent. public class filesplitutil {private endgültige statische Logger log = logManager.getLogger (fileSplitutil.class); private statische endgültige lange OriginFileSize = 1024 * 1024 * 100; // 100 m private statische endgültige Int BlockFileSize = 1024 * 1024 * 64; // Um zu verhindern, dass chinesische verstümmte chinesische, mussten Sie 2 an das N -Power nehmen/ ** * CVS -Dateitrenntrennzeichen */ private statische endgültige char cvSse -Parlatur = '^'; public static void main (String args []) {long start = system.currentTimemillis (); try {String Dateiname = "d: //csvtest//aa.csv"; Datei SourceFile = New Datei (Dateiname); if (SourceFile.length ()> = OriginFileSize) {String cvsFileName = Dateiname.replaceAll ("////", "/"); FilePlitutil fileSplitUtil = new FileSplitUtil (); List <string> parts = filePlitutil.splitbySize (cvsFileName, blockFileSize); für (String -Teil: Teile) {System.out.println ("Partname ist:"+Teil); }} System.out.println ("Gesamtdateilänge" + SourceFile.length () + ", Zeit zum Aufteilen der Datei:" + (System.currentTimemillis () - Start) + "MS."); } catch (Ausnahme e) {log.info (e.getStacktrace ()); }} / *** Split -Datei** @param Dateiname Der vollständige Dateiname, der geteilt werden soll Datei Datei = neue Datei (Dateiname); int count = (int) math.ceil (file.length () / (doppelt) bytesize); int countlen = (count + "") .Length (); RandomAccessfile RAF = New RandomAccessfile (Dateiname, "R"); langer TOTALLEN = raf.length (); Countdownlatch Latch = new Countdownlatch (count); für (int i = 0; i <count; i ++) {String partFileName = file.getPath ()+"." + links ((i + 1) + "", countlen, '0') + ".cvs"; int readSize = bytesize; langes startpos = (lang) i * bytesize; Long NextPos = (lang) (i+1) * bytesize; if (NextPos> totallen) {readSize = (int) (totallen-startpos); } neuer SplitRunnable (ReadSize, Startpos, Partfilename, Datei, Latch) .run (); Teils.Add (PartFileName); } latch.await (); // Warten darauf, dass alle Dateien geschrieben werden. Rückkehrteile; } / ** * Segmentverarbeitung runnable * * @author Supeidong * / private class splitrunnable implements runnable {int bytesize; String Part FileName; Datei OriginFile; lange Startpos; Countdownlatch -Latch; public splunnnable (int bytesize, long startpos, String partFileName, Datei OriginFile, Countdownlatch -Latch) {this.startpos = startpos; this.bytesize = bytesize; this.PartFileName = partFileName; this.originfile = OriginFile; this.latch = latch; } public void run () {randomAccessfile rfile; OutputStream OS; try {rfile = new randomAccessfile (OriginFile, "r"); byte [] b = neues byte [bytesize]; RFILE.SEEK (STARTPOS); // Bewegen Sie den Zeiger auf den Beginn jedes "Segments" 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 (); }}} / ** * Cut -Linien verschmelzen * * @param parts * / private void mergerow (list <string> parts) {list <partfile> partsfiles = new ArrayList <partfile> (); Versuchen Sie {// das geteilte Tabellenobjekt für (int i = 0; i <parts.size () zusammenstellen; i ++) {String partFileName = parts.get (i); Datei splitFileTemp = neue Datei (partFileName); if (splitFiletemp.exists ()) {partFile pARTFILE = new pARTFILE (); BufferedReader reader = new bufferedReader (neuer InputStreamReader (neuer 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 prepartFile = parts.get (i - 1); String Preendrow = ReadLastline (präparartFile); partFile.setfirstisfull (getCharCount (firstrow+preendrow)> getCharCount (SecondRow)); } partFiles.add (partFile); reader.close (); }} // Schreiben Sie die Zeilen, die für (int i = 0; i <partFiles.SIZE () - 1; i ++) {partfile partFile = partFiles.get (i) zusammengefasst werden müssen. 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 (Ausnahme e) {log.Error (e.getMessage ()); }} / ** * Erhalten Sie die Anzahl, mit der ein Zeichen erscheint * @param s * @return * / private int getCharCount (String s) {int count = 0; für (int i = 0; i <sength (); i ++) {if (s.charat (i) == cvsseparator) {count ++; }} return count; } / ** * Verwenden Sie BufferedInputStream, um die Anzahl der Dateizeilen zu lesen Byte [] C = neues Byte [1024]; int count = 0; int Readchars = 0; while ((messechars = is.read (c))! }} is.close (); Rückgabezahl; } / ** * Lesen Sie die letzte Datenzeile * @param Dateiname * @return * @throws ioException * / private String -ReadLastline (String -Dateiname) löscht IOException {// RandomAccessfile verwenden, finden Sie die letzte Datenzeile hinter RandomAccessfile Raf = New Accessfile (Filename, "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"); brechen; }}}} raf.close (); Rückkehr Lastline; } / ** * Ändern Sie die letzte Datenzeile * @param Dateiname * @param lastString * @return * @throws ioException * / private void WritElastline (String -Dateiname, String LastString) {try {// einen zufälligen Zugriffsdatei -Stream öffnen und lesen und schreiben. // Dateilänge, Anzahl der Bytes long filelength = randomFile.length (); // Verschieben Sie den Zeiger der Schreibdatei auf das Ende der Datei. randomFile.seek (filelength); // GBK muss hier hinzugefügt werden, ansonsten durch Randomfile.Write (laststring.getBytes ("gbk")); randomFile.close (); } catch (ioException e) {log.Error (e.getMessage ()); }} / ** * links fill * * @param str * @param länge * @param ch * @return * / public static String links (String str, int Länge, char ch) {if (str.length ()> = Länge) {return str; } char [] chs = new char [Länge]; Arrays.Fill (CHS, CH); char [] src = str. tocharArray (); System.ArrayCopy (SRC, 0, CHS, Länge - src.length, src.length); neue Zeichenfolge zurückgeben (CHS); } / *** Die interne Klasse von Dateizeilen fergen* / class Partfile {private String partFileName; private String firstrow; private String endrow; privat boolean Firstisfull; 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 (boolean Firstisfull) {this.firstisfull = Firstisfull; }}}Das obige dreht sich alles um diesen Artikel. Ich hoffe, dass es für alle hilfreich sein wird, Java -Programme zu lernen.