しばらく前に大量のデータが必要でした。 DBAはCVSファイルを提供しましたが、各CVSファイルのサイズは数GBであるため、直接読み込まれます。データベースは非常に遅く、メモリが不十分になります。この関数を実現するために、ファイルをすばやく分割するプログラムが記述されました。
Import org.apache.log4j.logmanager; import org.apache.log4j.logger; Import java.io。*; Import Java.util。 public class filesplitutil {private final static logger log = logmanager.getLogger(filesplitutil.class);プライベート静的最終long OriginFilesize = 1024 * 1024 * 100; // 100Mプライベートスタティックファイナルブロックファイルズ= 1024 * 1024 * 64; //中国語の文字化けを防ぐには、2をN Power/ ** * cvs File Separator */ private static final char cvsseparator = '^'; public static void main(string args []){long start = system.currenttimemillis(); try {string filename = "d://csvtest//aa.csv";ファイルsourcefile = new file(filename); if(sourcefile.length()> = overingfilesize){string cvsfilename = filename.replaceall( "////"、 "/"); filesplitutil filesplitutil = new filesplitutil(); list <string> parts = filesplitutil.splitbysize(cvsfilename、blockfilesize); for(string part:parts){system.out.println( "partname is:"+part); }} system.out.println( "合計ファイル長" + sourcefile.length() + "、fileを分割する時間:" +(system.currenttimemillis() - start) + "ms"); } catch(例外e){log.info(e.getStacktrace()); }} / ***分割ファイル** @param filename完全なファイル名を分割する* @param bytesize split* @return split file names* / public list <string> splitbysize(string filename、int bytesize)throws ioexception、interrupedexception {interruptedexception {list <string> part = new arraylist <string> file file = new file(filename); int count =(int)math.ceil(file.length() /(double)bytesize); int countlen =(count + "").length(); randomAccessfile raf = new RandomAccessFile(filename、 "r"); long totallen = raf.length(); CountDownLatch latch = new CountDownLatch(count); for(int i = 0; i <count; i ++){string partfilename = file.getPath()+"。" + leftpad((i + 1) + ""、countlen、 '0') + ".cvs"; int readsize = bytesize; long startpos =(long)i * bytesize; long nextpos =(long)(i+1) * bytesize; if(nextpos> totallen){readsize =(int)(totallen-startpos); } new splitRunnable(readsize、startpos、partfilename、file、latch).run(); parts.add(partfilename); } latch.await(); //すべてのファイルが書き込まれるのを待っている//切断中に行が切断される場合があり、すべての分割ファイルがMergerow(パーツ)を処理できます。パーツを返します。 } / ** *セグメント処理runnable * * @author supeidong * / private class splitrunnable runnable {int bytesize;文字列partfileName;ファイルOriginFile;長いstartpos; CountDownLatchラッチ; public splitRunnable(int bytesize、long startpos、string partfilename、file ostirionfile、countdownlatch latch){this.startpos = startpos; this.bytesize = bytesize; this.partfileName = partfileName; this.originfile = ovirionfile; this.latch = latch; } public void run(){randomaccessfile rfile; outputStream OS; try {rfile = new RandomAccessFile(OriginFile、 "r"); byte [] b = new byte [bytesize]; rfile.seek(startpos); //ポインターを各「セグメント」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(); }}} / ** *マージカットライン * * @param parts * / private void mergerow(list <string> parts){list <partfile> partsfiles = new arraylist <partfile>(); try {//(int i = 0; i <parts.size(); i ++){string partfilename = parts.get(i);ファイルsplitFileTemp = new File(partfileName); if(splitfiletemp.exists()){partfile partfile = new Partfile(); BufferedReader Reader = new BufferedReader(new inputStreamReader(new FileInputStream(splitFileTemp)、 "gbk"));文字列firstow = reader.readline();文字列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);文字列preendrow = readlastline(prepartfile); partfile.setfirstisfull(getCharCount(firstow+preendrow)> getCharCount(SecondRow)); } partfiles.add(partfile); reader.close(); }} //(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(例外e){log.error(e.getmessage()); }} / ** *文字が表示される回数を取得 * @param s * @return * / private int getCharCount(string s){int count = 0; for(int i = 0; i <s.length(); i ++){if(s.charat(i)== cvsseparator){count ++; }} return count; } / ** * bufferedInputStreamを使用してファイルラインの数を読み取ります * * @param filename * @return * / public int getFilerow(string filename)throws ioexception {inputstream is = new fileinputStream(filename)); byte [] c = new byte [1024]; int count = 0; int readchars = 0; while((readchars = is.read(c))!= -1){for(int i = 0; i <readchars; ++ i){if(c [i] == '/n')++ count; }} is.close();返品数; } / ** *データの最後の行を読み取る * @param filename * @return * @throws ioexception * / private string readlastline(string filename)throws ioexception {// randomAccessfileを使用して、ランダムアクセスファイルraf = new randomaccessfile(filename、 "r"); long len = raf.length();文字列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");壊す; }}}} raf.close(); lastLineを返します。 } / ** *最終データの変更 * @param filename * @param lastString * @return * @throws ioexception * / private void writeLastline(string filename、string lastString){try {//ランダムアクセスファイルのストリームを開き、読み取りと書き込み方法に従って読み取りと書き込み//ファイルの長さ、バイト数long filelength = randomfile.length(); //ファイルの最後に書き込みファイルポインターを移動します。 randomfile.seek(filelength); // GBKをここに追加する必要があります。そうでなければ、randomfile.write(lastString.getBytes( "gbk")); randomfile.close(); } catch(ioexception e){log.error(e.getmessage()); }} / **左の塗りつぶし * * @param str * @param length * @param ch * @return * / public static string leftpad(string str、int length、char ch){if(str.length()> = length){return str; } char [] chs = new char [length]; arrays.fill(chs、ch); char [] src = str.tochararray(); System.ArrayCopy(SRC、0、CHS、長さ-SRC.LENGTH、SRC.LENGTH);新しい文字列(CHS)を返します。 } / ***ファイルラインのマージ内部クラス* / class partfile {private string partfilename;プライベートストリングファイストロウ。プライベートストリングエンドロー; Private Boolean Firstisfull; public string getPartFileName(){return partfileName; } public void setPartFileName(String PartFileName){this.PartFileName = partFileName; } public String getFirstrow(){return firstrow; } public void setfirstrow(string firstow){this.firstrow = firstow; } 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; }}}上記はこの記事に関するものです。誰もがJavaプログラミングを学ぶことが役立つことを願っています。