Необходима большая партия данных некоторое время назад. DBA предоставил файлы CVS, но каждый файл CVS имеет размер несколько ГБ, поэтому он загружается напрямую. База данных очень медленная, и это приведет к недостаточной памяти. Чтобы реализовать эту функцию, была написана программа для быстрого разделения файлов.
Импорт org.apache.log4j.logmanager; import org.apache.log4j.logger; Импорт java.io.*; импортировать java.util.*; импортировать java.util.concurrent.*; public class filesplitutil {private final Static Logger log = logmanager.getLogger (filesplitutil.class); Частный статический окончательный Long OriginFilesize = 1024 * 1024 * 100; // 100 м Частная статическая конечная окончательная финальная блокируйте = 1024 * 1024 * 64; // Чтобы предотвратить китайский искаженность, вы должны перенести 2 в N Power/ ** * CVS -сепаратор файла */ Private Static Final Final CHSSEPARATATOR = '^'; public static void main (string args []) {long start = system.currenttimemillis (); try {string fileName = "d: //csvtest//aa.csv"; File SourceFile = новый файл (имя файла); if (sourcefile.length ()> = originfilesize) {string cvsfilename = filename.replaceall ("////", "/"); Filesplitutil filesplitutil = new filesplitutil (); Список <string> parts = filesplitutil.splitbysize (cvsfilename, blockfilesize); for (string part: parts) {System.out.println ("partname Is:"+part); }} System.out.println ("Total File Delon" + sourcefile.length () + ", время для разделения файла:" + (System.currentTimeMillis () - Start) + "MS."); } catch (Exception e) {log.info (e.getStackTrace ()); }} / *** Сплит файл** @param filename Полное имя файла, которое нужно разделить* @param bytesize split, сколько байтов* @return Список имен разделенных файлов* / public list <string> splitbysize (String filename, int bytesize) throws ioException, rewruptExexception {sipe> parts = resteslist <string>;); File file = new File (имя файла); int count = (int) math.ceil (file.length () / (double) bytesize); int countlen = (count + "") .length (); Randomaccessfile raf = new randomaccessfile (имя файла, "r"); long totallen = raf.length (); Countdownlatch latch = new countdownlatch (count); for (int i = 0; i <count; i ++) {string partfilename = file.getPath ()+".". + левая панель ((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 (Parts); вернуть части; } / ** * Обработка сегмента runnable * * @author supeidong * / private class splitrunnable реализует {int bytesize; String partfilename; File Originfile; длинные стартапов; Countdownlatch Latch; public splitrunnable (int bytesize, Long Startpos, String partfilename, File 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 = новый байт [байтесзирует]; 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 (); }}} / ** * LENGE CUT LINE * * @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); File splitfiletemp = new File (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 prepartfile = parts.get (i - 1); String preendrow = readlastline (prepartfile); partfile.setFirstisfull (getCharcount (firstrow+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 (Exception e) {log.error (e.getMessage ()); }} / ** * Получите количество раз, когда появляется символ. for (int i = 0; i <s.length (); i ++) {if (s.charat (i) == cvsseparator) {count ++; }} return count; } / ** * Используйте BufferedInptream для чтения количества файлов * * @param filename * @return * / public int getFilerow (String FileName) Throws IOException {inputStream IS = new BuffereNputStream (new FileInputStream (FileName)); байт [] c = новый байт [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 (); 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 (antilline.getbytes ("8859_1"), "gbk"); перерыв; }}}} raf.close (); вернуть последнюю линию; } / ** * Измените последнюю строку данных * @param filename * @param laststring * @return * @throws ioexception * / private void writelastline (String filename, String lastString) {try {// Открыть случайный поток файлов и чтение и написать в соответствии с методом чтения и записи Randomaccessfile randomfile = new randomAccessfile (illename »; // Длина файла, количество байтов длиной 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 Leathpad (String Str, int length, char ch) {if (str.length ()> = length) {return str; } char [] chs = new char [длина]; Arrays.fill (chs, ch); char [] src = str.tochararray (); System.ArrayCopy (SRC, 0, CHS, длина - SRC.Length, SRC.Length); вернуть новую строку (chs); } / *** LIGE LINE FILE Внутренний класс* / class partfile {private String partfilename; частная строка Firstrow; частная строка Endrow; Частный логический 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; }}}Выше приведено все об этой статье, я надеюсь, что для всех будет полезно изучать программирование Java.