ต้องใช้ข้อมูลชุดใหญ่เมื่อไม่นานมานี้ DBA ให้ไฟล์ CVS แต่ไฟล์ CVS แต่ละไฟล์มีขนาด GB หลายขนาดดังนั้นจึงโหลดโดยตรง ฐานข้อมูลช้ามากและจะทำให้หน่วยความจำไม่เพียงพอ เพื่อที่จะตระหนักถึงฟังก์ชั่นนี้โปรแกรมที่จะแยกไฟล์ได้อย่างรวดเร็วถูกเขียนขึ้น
นำเข้า org.apache.log4j.logManager; นำเข้า org.apache.log4j.logger; นำเข้า java.io.*; นำเข้า Java.util.*; นำเข้า Java.util.concurrent.*; คลาสสาธารณะ FilesPlitUtil {ส่วนตัว logger คงสุดท้าย logger log = logManager.getLogger (filesplitutil.class); แบบคงที่ส่วนตัวสุดท้าย Long OriginFilesize = 1024 * 1024 * 100; // 100m ส่วนตัวคงที่ส่วนตัว int blockfilesize = 1024 * 1024 * 64; // เพื่อป้องกันไม่ให้จีนอ่านออกมาได้ โมฆะคงที่สาธารณะหลัก (สตริง args []) {long start = system.currentTimeMillis (); ลอง {String filename = "d: //csvtest//aa.csv"; File SourceFile = ไฟล์ใหม่ (ชื่อไฟล์); if (sourcefile.length ()> = olonicfilesize) {string cvsfilename = filename.replaceall ("//////", "/"); filesplitUtil filesplitUtil = ใหม่ filesplitutil (); รายการ <String> parts = filesplitutil.splitbysize (cvsfilename, blockfilesize); สำหรับ (ส่วนสตริง: ชิ้นส่วน) {system.out.println ("partname คือ:"+ส่วน); }} system.out.println ("ความยาวไฟล์ทั้งหมด" + sourcefile.length () + ", เวลาในการแยกไฟล์:" + (system.currentTimeMillis () - เริ่มต้น) + "ms."); } catch (exception e) {log.info (e.getStackTrace ()); }} / *** ไฟล์แยก** @param filename ชื่อไฟล์ที่สมบูรณ์ที่จะแยก* @param bytesize split โดยจำนวนไบต์* @return รายการชื่อไฟล์แยก* / รายการสาธารณะ <String> splitBySize ไฟล์ไฟล์ = ไฟล์ใหม่ (ชื่อไฟล์); int count = (int) math.ceil (file.length () / (สองเท่า) ไบต์); int countlen = (count + "") .length (); RandomaccessFile Raf = new RandomaccessFile (ชื่อไฟล์, "r"); Long totallen = raf.length (); countdownlatch latch = new countdownlatch (นับ); สำหรับ (int i = 0; i <count; i ++) {string partfileName = file.getPath ()+" + leftpad ((i + 1) + "", countlen, '0') + ".cvs"; int readsize = bytesize; startPos ยาว = (ยาว) i * ไบต์ long nextPos = (ยาว) (i+1) * ไบต์ if (nextPos> totAllen) {readSize = (int) (totallen-startPos); } splitRunnable ใหม่ (readsize, startpos, partfilename, ไฟล์, latch) .run (); Parts.add (partfilename); } latch.await (); // การรอไฟล์ทั้งหมดที่จะเขียน // บรรทัดอาจถูกตัดในระหว่างการตัดและไฟล์แยกทั้งหมดอาจถูกประมวลผล, mergerow (ส่วน); ชิ้นส่วนกลับ; } / ** * การประมวลผลส่วน runnable * * @author supeidong * / คลาสส่วนตัว SplitRunnable Enprement Runnable {int bytesize; สตริง partfilename; ไฟล์ Originfile; startpos ยาว; Latch Countdownlatch; Public SplitRunnable (int bytesize, startpos ยาว, สตริง 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"); ไบต์ [] b = ไบต์ใหม่ [ไบต์]; rfile.seek (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 * / Void Private Mergerow (รายการ <String> ชิ้นส่วน) {รายการ <partfile> partsFiles = new ArrayList <PartFile> (); ลอง {// ประกอบวัตถุตารางแยกสำหรับ (int i = 0; i <parts.size (); i ++) {string partfilename = parts.get (i); File SplitFileTemp = ไฟล์ใหม่ (PartFileName); if (splitFileTemp.exists ()) {partFile partFile = new partFile (); bufferedReader reader = ใหม่ bufferedReader (ใหม่ inputStreamReader (ใหม่ FileInputStream (SplitFileTemp), "GBK")); String firstrow = reader.readline (); สตริง secondRow = reader.readline (); string endrow = readLastline (partfileName); partfile.SetPartFileName (partfileName); partfile.setFirTrow (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 ()); }} / ** * รับจำนวนครั้งที่อักขระปรากฏขึ้น * @param s * @return * / ส่วนตัว int getCharcount (สตริง s) {int count = 0; สำหรับ (int i = 0; i <s.length (); i ++) {ถ้า (s.charat (i) == cvsseparator) {count ++; }} นับคืน; } / ** * ใช้ bufferedInputStream เพื่ออ่านจำนวนบรรทัดไฟล์ * * @param filename * @return * / public int getFilerow (ชื่อไฟล์สตริง) พ่น IOException {inputStream คือ = ใหม่ bufferedInputStream (ใหม่ FileInputStream (ชื่อไฟล์); ไบต์ [] c = ไบต์ใหม่ [1024]; จำนวน int = 0; int readchars = 0; ในขณะที่ ((readchars = is.read (c))! = -1) {สำหรับ (int i = 0; i <readchars; ++ i) {ถ้า (c [i] == '/n') ++ นับ; }} is.close (); นับคืน; } / ** * อ่านบรรทัดสุดท้ายของข้อมูล * @param filename * @return * @throws ioexception * / สตริงส่วนตัว readlastline (ชื่อไฟล์สตริง) พ่น IOException {// ใช้แบบสุ่มไฟล์ค้นหาบรรทัดสุดท้ายจากเบื้องหลัง rafaccessfile raf = new RandomaccessFile 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 = สตริงใหม่ (lastline.getBytes ("8859_1"), "GBK"); หยุดพัก; }}}} raf.close (); กลับมา lastline; } / ** * แก้ไขบรรทัดสุดท้ายของข้อมูล * @param filename * @param lastString * @return * @throws ioexception * / โมฆะส่วนตัว writeLaStline (ชื่อไฟล์สตริงสตริงสุดท้าย) {ลอง {// เปิดไฟล์การเข้าถึงแบบสุ่ม // ความยาวของไฟล์จำนวนไบต์ยาว filelength = randomfile.length (); // เลื่อนตัวชี้ไฟล์เขียนไปที่ส่วนท้ายของไฟล์ Randomfile.seek (Filelength); // GBK จะต้องเพิ่มที่นี่มิฉะนั้น randomfile.write ที่อ่านไม่ออก (LastString.getBytes ("GBK")); randomfile.close (); } catch (ioexception e) {log.error (e.getMessage ()); }} / ** * เติมซ้าย * * @param str * @param ความยาว * @param ch * @return * / สตริงคงที่สาธารณะ leftpad (สตริง str, ความยาว int, char ch) {ถ้า (str.length ()> = ความยาว) {return str; } char [] CHS = ถ่านใหม่ [ความยาว]; array.fill (chs, ch); ถ่าน [] src = str.tochararray (); System.ArrayCopy (SRC, 0, CHS, ความยาว - SRC.Length, SRC.Length); ส่งคืนสตริงใหม่ (CHS); } / *** ผสานบรรทัดไฟล์ภายในคลาส* / คลาส partfile {สตริงส่วนตัว partfileName; สตริงส่วนตัว firstrow; สตริงส่วนตัว Endrow; บูลีนส่วนตัว Firstisfull; สตริงสาธารณะ getPartFileName () {return partfilename; } โมฆะสาธารณะ setPartFileName (String partFileName) {this.partFileName = partFileName; } สตริงสาธารณะ getFirTrow () {return firstrow; } โมฆะสาธารณะ setFirstrow (String firstrow) {this.firstrow = firstrow; } สตริงสาธารณะ getEndrow () {return endrow; } โมฆะสาธารณะ setEndrow (endrow String) {this.endrow = endrow; } บูลีนสาธารณะ getFirstisfull () {return firstisfull; } โมฆะสาธารณะ setFirstisfull (บูลีน firstisfull) {this.firstisfull = firstisfull; -ข้างต้นเป็นเรื่องเกี่ยวกับบทความนี้ฉันหวังว่ามันจะเป็นประโยชน์สำหรับทุกคนในการเรียนรู้การเขียนโปรแกรม Java