كان هناك حاجة إلى مجموعة كبيرة من البيانات منذ بعض الوقت. قدمت DBA ملفات CVS ، ولكن كل ملف CVS هو عدة جيجابايت في الحجم ، لذلك يتم تحميله مباشرة. قاعدة البيانات بطيئة للغاية وستؤدي إلى عدم كفاية ذاكرة. من أجل إدراك هذه الوظيفة ، تمت كتابة برنامج لتقسيم الملفات بسرعة.
استيراد org.apache.log4j.logmanager ؛ استيراد org.apache.log4j.logger ؛ استيراد java.io.*؛ استيراد java.util.*؛ استيراد java.util.concurrent.*؛ FilesplitUtil {Private Final Static Logger log = logManager.getLogger (filesplitutil.class) ؛ الأصل الثابت الطويل الأصل الطويل = 1024 * 1024 * 100 ؛ // 100M Final Final Final Finalfilesize = 1024 * 1024 * 64 ؛ // لمنع تشويه الصينيين ، يجب أن تأخذ 2 إلى N Power/ ** * CVS File Seplator */ Private Static Final Char CvsseParator = '^' ؛ public static void main (String args []) {long start = system.currentTimeMillis () ؛ Try {String filename = "d: //csvtest//aa.csv" ؛ مصدر الملف = ملف جديد (اسم الملف) ؛ if (sourceFile.Length ()> = OriginFilesize) {String cvsfilename = filename.replaceall ("////" ، "/") ؛ filesplitutil filesplitutil = new filesplitutil () ؛ قائمة <Tring> parts = filesplitutil.splitBysize (cvsfilename ، blockfilesize) ؛ لـ (جزء سلسلة: أجزاء) {system.out.println ("partName is:"+part) ؛ }} system.out.println ("طول الملف الكلي" + sourceFile.Length () + "، وقت تقسيم الملف:" + (System.CurrentTimeMillis () - start) + "MS.") ؛ } catch (استثناء e) {log.info (e.getStackTrace ()) ؛ }} / *** تقسيم الملف** param filename اسم الملف الكامل ليتم تقسيمه* param bytesize تقسيم بواسطة عدد البايت* @قائمة أسماء الملفات المقسمة* / قائمة عامة <string> splitbysize (اسم ملف السلسلة ، int bytesize) يلقي ioException ، interruptedException {list <string> parts <arraylist <string> () ؛ ملف الملف = ملف جديد (اسم الملف) ؛ int count = (int) math.ceil (file.length () / (double) bytesize) ؛ int countlen = (count + "") .Length () ؛ RandomAccessFile raf = new RandomAccessFile (اسم الملف ، "R") ؛ totallen long = raf.length () ؛ CountDownLatch Latch = New CountDownLatch (count) ؛ لـ (int i = 0 ؛ i <count ؛ i ++) {String partFilename = file.getPath ()+"." + LeftPad ((i + 1) + "" ، countlen ، '0') + ".cvs" ؛ int readsize = bytesize ؛ startPos طويل = (طويل) i * bytesize ؛ Long NextPos = (طويل) (i+1) * bytesize ؛ if (nextPos> totallen) {readSize = (int) (totallen-startpos) ؛ } جديد splitrunnable (readsize ، startPos ، partFilename ، file ، latch) .run () ؛ parts.add (partFilename) ؛ } latch.await () ؛ // في انتظار كتابة جميع الملفات // قد يتم قطع الخطوط أثناء القطع ، وقد تتم معالجة جميع الملفات المقسمة ، الاندماج (أجزاء) ؛ أجزاء العودة } / ** * معالجة القطاع runnable * * Author supeidong * / private class splitrunnable reglements {int bytesize ؛ سلسلة partfilename ؛ ملف الأصل. startPos طويلة. Countdownlatch Latch ؛ public splitrunnable (int bytesize ، startPos long ، 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 ؛ حاول {rfile = new RandomAccessFile (OriginFile ، "r") ؛ بايت [] ب = بايت جديد [bytesize] ؛ rfile.keek (startPos) ؛ // انقل المؤشر إلى بداية كل "جزء" int s = rfile.read (b) ؛ OS = جديد 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 (قائمة <string> قطع الغيار) {list <portFile> partsfiles = new ArrayList <PortFile> () ؛ حاول {// تجميع كائن جدول الانقسام لـ (int i = 0 ؛ i <parts.size () ؛ i ++) {String partFilename = parts.get (i) ؛ ملف splitfileTemp = ملف جديد (partFilename) ؛ if (splitfileTemp.exists ()) {partfile partfile = new partfile () ؛ BufferedReader Reader = جديد BufferedReader (New InputStreamReader (FileInputStream جديد (splitfileTemp) ، "GBK")) ؛ سلسلة firstrow = reader.ReadLine () ؛ String SecondRow = reader.ReadLine () ؛ سلسلة 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 (Firstrow+preendRow)> getCharCount (SecondRow)) ؛ } partfiles.add (partfile) ؛ reader.close () ؛ }} // اكتب الخطوط التي يجب دمجها لـ (int i = 0 ؛ i <partfiles.size () - 1 ؛ i ++) {partfile portfile = partfiles.get (i) ؛ partfile partfilenext = partfiles.get (i + 1) ؛ StringBuilder sb = new StringBuilder () ؛ if (partfilenext.getfirstisfull ()) {sb.append ("/r/n") ؛ sb.append (partfilenext.getFirstrow ()) ؛ } آخر {sb.append (partfilenext.getfirstrow ()) ؛ } writelastline (partfile.getPartFilename () ، sb.toString ()) ؛ }} catch (استثناء e) {log.error (e.getMessage ()) ؛ }} / ** * احصل على عدد مرات يظهر حرف * param s * regurn * / private int getCharCount (String s) {int count = 0 ؛ لـ (int i = 0 ؛ i <s.length () ؛ i ++) {if (s.charat (i) == cvSseParator) {count ++ ؛ }} عدد الإرجاع ؛ } / ** * استخدم BufferedInputStream لقراءة عدد خطوط الملف * * param filename * @REGANT * / public int getFilerow (اسم ملف السلسلة) يلقي iOexception {inputStream هو = جديد bufferedInputStream (fileInputStream جديد (filename)) ؛ Byte [] C = New Byte [1024] ؛ عدد int = 0 ؛ int readchars = 0 ؛ بينما ((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 readlastline (اسم ملف السلسلة) يلقي ioException {// use randomaccessfile ، ابحث عن السطر الأخير من البيانات من خلف Randomaccessfile raf = new randyscancessfile (filename ، "r") ؛ Long len = raf.length () ؛ سلسلة LastLine = "" ؛ if (len! = 0l) {long pos = len - 1 ؛ بينما (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 (اسم ملف السلسلة ، السلسلة lastString) {try {// فتح ملف وصول عشوائي وقراءة وكتابة طريقة transycessfile randomactile = new randomactile (filen) ؛ // طول الملف ، عدد البايتات الطويلة الطول = randomfile.length () ؛ // انقل مؤشر ملف الكتابة إلى نهاية الملف. randomfile.keek (طول fileLenge) ؛ // يجب إضافة GBK هنا ، وإلا golled randomfile.write (lastString.getBytes ("GBK")) ؛ randomfile.close () ؛ } catch (ioException e) {log.error (e.getMessage ()) ؛ }} / ** * fill left * * param str * param length * param ch * @regurn * / public static stringpad (string str ، int char ، char ch) {if (str.length ()> = length) {return str ؛ } char [] chs = new Char [length] ؛ المصفوفات. char [] src = str.tochararray () ؛ System.ArrayCopy (SRC ، 0 ، CHS ، Length - src.length ، src.length) ؛ إرجاع سلسلة جديدة (CHS) ؛ } / *** دمج سطر الملف الداخلي* / class partfile {private string partfilename ؛ السلسلة الخاصة firstrow ؛ سلسلة خاصة endrow ؛ خاص منطقي FirstIsfull ؛ السلسلة العامة getPartFilename () {return partFilename ؛ } public void setPartFilename (سلسلة partFilename) {this.partfilename = partFilename ؛ } سلسلة عامة getFirStrow () {return firstrow ؛ } public void setFirStrow (String firstrow) {this.firstrow = firstrow ؛ } السلسلة العامة 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.