นำเข้า java.io.BufferedReader;
นำเข้า java.io.BufferedWriter;
นำเข้า java.io.FileNotFoundException;
นำเข้า java.io.FileReader;
นำเข้า java.io.FileWriter;
นำเข้า java.io.IOException;
นำเข้า java.util.Collections;
นำเข้า java.util.Iterator;
นำเข้า java.util.LinkedList;
นำเข้า java.util.สุ่ม;
LargeMappedFiles ระดับสาธารณะ {
-
* การเรียงลำดับและการรวมข้อมูลขนาดใหญ่
-
* @param args
-
โมฆะคงที่สาธารณะ main (String [] args) พ่น IOException {
//เส้นทางในการเขียนไฟล์
สตริง filePath = "D://456";
// พาธสำหรับแยกไฟล์
สตริง sqlitFilePath = "D://456//123";
//จำนวนข้อมูล
int จำนวนนับ=10000000;
//จำนวนไฟล์ย่อย
int CountFile=10;
//แม่น.
int countAccuracy=30*CountFile;
startNumber ยาว=System.currentTimeMillis();
//เขียนไฟล์ข้อมูลขนาดใหญ่
WriteData(filePath,CountNumbers);
System.out.println("การจัดเก็บเสร็จสมบูรณ์");
// แยกไฟล์ข้อมูลขนาดใหญ่ออกเป็นไฟล์ขนาดเล็กอีกสิบไฟล์
sqlitFileDate(filePath, sqlitFilePath,CountFile);
System.out.println("การตัดไฟล์เสร็จสิ้น!");
// จัดเรียงข้อมูลของแต่ละไฟล์
singleFileDataSort(sqlitFilePath,CountFile);
System.out.println("แต่ละไฟล์ย่อยจะถูกจัดเรียง!");
//การปรับความแม่นยำ การเปรียบเทียบ และการรวมข้อมูลไฟล์ทั้ง 10 ไฟล์
deathDataFile(filePath,sqlitFilePath,countAccuracy,CountFile);
System.out.println("บูรณาการเสร็จสมบูรณ์");
หยุดยาวจำนวน=System.currentTimeMillis();
System.out.println("ใช้เวลานาน"+(stopNumber-startNumber)/1000+"มิลลิวินาที");
-
//เขียนไฟล์ข้อมูลขนาดใหญ่
โมฆะสาธารณะคง WriteData (เส้นทางสตริง int CountNumbers) พ่น IOException {
เส้นทาง = เส้นทาง + "//12114.txt";
FileWriter fs = FileWriter ใหม่ (เส้นทาง);
BufferedWriter fw=ใหม่ BufferedWriter(fs);
สำหรับ (int i = 0; i < CountNumbers; i ++) {
fw.write(สุ่มใหม่().nextInt(Integer.MAX_VALUE) + "/r/n");
-
fw.ปิด();
fs.ปิด();
-
// แยกไฟล์ข้อมูลขนาดใหญ่ออกเป็นไฟล์ขนาดเล็กอีกสิบไฟล์
โมฆะสาธารณะคงที่ sqlitFileDate (เส้นทางไฟล์สตริง, สตริง sqlitPath,
int CountFile) ส่ง IOException {
FileWriter fs = null;
BufferedWriter fw=null;
FileReader fr = FileReader ใหม่ (filepath + "//12114.txt");
BufferedReader br = new BufferedReader(fr); // อ่านและรับข้อมูลทั้งหมด
อินท์ i = 1;
LinkedList WriterLists=new LinkedList(); // เริ่มต้นการรวบรวมออบเจ็กต์สตรีมไฟล์
LinkedList fwLists=ใหม่ LinkedList();
สำหรับ (int j = 1; j <= CountFile; j ++) {
//ประกาศวัตถุ
fs = FileWriter ใหม่ (sqlitPath + "//12" + j + ".txt",false);
fw=ใหม่ BufferedWriter(fs);
//โหลดวัตถุเข้าคอลเลกชัน
WriterLists.add(fs);
fwLists.add(fw);
-
//ตรวจสอบว่ายังมีข้อมูลที่จะส่งคืนในสตรีมไฟล์หรือไม่
ในขณะที่ (br.ready()) {
int count=1;//เริ่มต้นสตรีมไฟล์แรก
สำหรับ (ตัววนซ้ำ ตัววนซ้ำ = fwLists.iterator(); iterator.hasNext();) {
ประเภท BufferedWriter = (BufferedWriter) iterator.next();
if(i==count)//พิจารณาว่าสตรีมไฟล์ใดที่ต้องเขียนข้อมูล
-
//เขียนข้อมูล ข้ามไปยังสตรีมไฟล์ถัดไป และเขียนข้อมูลถัดไป
type.write(br.readLine() + "/r/n");
หยุดพัก;
-
นับ++;
-
//ตรวจสอบว่าได้เข้าถึงไฟล์สตรีมล่าสุดแล้วหรือไม่
ถ้า (i >= CountFile) {
ฉัน = 1;
} อื่น
ฉัน++;
-
br.ปิด();
fr.ปิด();
สำหรับ (ตัววนซ้ำ ตัววนซ้ำ = fwLists.iterator(); iterator.hasNext();) {
วัตถุ BufferedWriter = (BufferedWriter) iterator.next();
วัตถุ.ปิด();
-
//สำรวจและปิดสตรีมไฟล์ย่อยทั้งหมด
สำหรับ (ตัววนซ้ำ ตัววนซ้ำ = WriterLists.iterator(); iterator.hasNext();) {
วัตถุ FileWriter = (FileWriter) iterator.next();
วัตถุ.ปิด();
-
-
// จัดเรียงข้อมูลของแต่ละไฟล์
โมฆะคงที่สาธารณะ singleFileDataSort (String path1, int CountFile) พ่น IOException {
จำนวน LinkedList = null;
สำหรับ (int i = 1; i <= CountFile; i++) {
nums = รายการลิงค์ใหม่();
เส้นทางสตริง = path1 + "//12" + i + ".txt";
พยายาม {
FileReader fr = FileReader ใหม่ (เส้นทาง);
BufferedReader br = BufferedReader ใหม่ (fr);
ในขณะที่ (br.ready()) {
// เพิ่มข้อมูลเดี่ยวที่อ่านลงในคอลเลกชัน
nums.add(Integer.parseInt(br.readLine()));
-
// จัดเรียงคอลเลกชัน
Collections.sort(ตัวเลข);
//เขียนข้อมูลที่เรียงลำดับลงในไฟล์ต้นฉบับ
numberSort (ตัวเลข, เส้นทาง);
br.ปิด();
fr.ปิด();
} จับ (NumberFormatException e) {
e.printStackTrace();
} จับ (FileNotFoundException จ) {
e.printStackTrace();
} จับ (IOException จ) {
e.printStackTrace();
-
-
-
// เรียงลำดับข้อมูลแต่ละไฟล์แล้วเขียนลงในไฟล์ต้นฉบับ
โมฆะสาธารณะ numberSort แบบคงที่ (รายการ LinkedList, เส้นทางสตริง) {
พยายาม {
FileWriter fs = FileWriter ใหม่ (เส้นทาง);
BufferedWriter fw=ใหม่ BufferedWriter(fs);
สำหรับ (ตัววนซ้ำ ตัววนซ้ำ = list.iterator(); iterator.hasNext();) {
วัตถุ object = (Object) iterator.next();
fw.write(วัตถุ + "/r/n");
-
fw.ปิด();
fs.ปิด();
} จับ (IOException จ) {
e.printStackTrace();
-
-
//การรวมข้อมูลไฟล์ขั้นสุดท้าย (การปรับความแม่นยำ)
โมฆะสาธารณะคงที่ deathDataFile (เส้นทางไฟล์สตริง, สตริง sqlitFilePath1,
int countAccuracy, int CountFile) ส่ง IOException {
LinkedList nums = new LinkedList(); //เพิ่มข้อมูลและเรียงลำดับ
Object temp = null; // บันทึกหมายเลขสุดท้ายที่เหลือในแต่ละการเรียงลำดับ
ispass บูลีน = false;
LinkedList ispasses = null; //บันทึกข้อมูลสถานะของไฟล์ข้อมูล
FileWriter fs = new FileWriter(filepath + "//Sort.txt", false); //สร้างสตรีมไฟล์สำหรับการเขียนข้อมูลแบบรวม
BufferedWriter bw=ใหม่ BufferedWriter(fs);
FileReader fr = null; // ประกาศการอ่านไฟล์สตรีม
BufferedReader br = null; // ประกาศ BufferedReader
LinkedList WriterLists = new LinkedList(); // เริ่มต้นการรวบรวมออบเจ็กต์สตรีมไฟล์
LinkedList WriterListFile = LinkedList ใหม่ ();
สำหรับ (int j = 1; j <= CountFile; j ++) {
// ประกาศวัตถุและเปิดสตรีมไฟล์ย่อยทั้งหมดเพื่อเข้าถึงข้อมูลของไฟล์ย่อยทั้งหมด
fr = FileReader ใหม่ (sqlitFilePath1 + "//12" + j + ".txt");
//เปิด BufferedReaders ทั้งหมดเพื่ออำนวยความสะดวกในการอ่านทั้งบรรทัดในครั้งต่อไป
br = BufferedReader ใหม่ (fr);
//โหลดวัตถุ FileReader ทั้งหมดลงในคอลเลกชัน
WriterListFile.add(fr);
//โหลดวัตถุ BufferedReader ทั้งหมดลงในคอลเลกชัน
WriterLists.add(br);
-
สำหรับ (;;) {
// จัดเก็บสถานะข้อมูลของไฟล์ต้นฉบับทั้ง 10 ไฟล์ไว้ในคอลเลกชันเพื่ออำนวยความสะดวกในการตัดสินในภายหลัง
ispasses = ใหม่ LinkedList();
// อ่านข้อมูลส่วนบุคคลจากไฟล์ต้นฉบับสิบไฟล์ตามลำดับ
สำหรับ (ตัววนซ้ำ ตัววนซ้ำ = WriterLists.iterator(); iterator.hasNext();) {
วัตถุ BufferedReader = (BufferedReader) iterator.next();
วัตถุ obj = โมฆะ;
ในขณะที่ (object.ready()) {
//เพิ่มข้อมูลสำหรับแต่ละไฟล์สตรีม
nums.add(Integer.parseInt(object.readLine().toString()));
หยุดพัก;
-
ถ้า (object.ready() == false)
ispasses.add("true"); //บันทึกสถานะข้อมูลในแต่ละไฟล์ลงในคอลเลกชัน
-
// พิจารณาว่าจะเข้ามาครั้งแรกหรือไม่
ถ้า (nums.size() % countAccuracy == 0 && ispass == false) {
// จัดเรียงคอลเลกชัน
Collections.sort(ตัวเลข);
//รับข้อมูลที่ใหญ่ที่สุดและเขียนข้อมูลอื่นๆ ลงในไฟล์การเรียงลำดับทั้งหมด
temp = numberSortData (ตัวเลข, พาธไฟล์, เท็จ, countAccuracy, bw);
//เริ่มต้นการรวบรวมอีกครั้ง
nums = รายการลิงค์ใหม่();
//เพิ่มข้อมูลที่เหลือจากการเปรียบเทียบชุดก่อนหน้า
nums.add(อุณหภูมิ);
ไอพาส = จริง;
//บันทึกปริมาณข้อมูลของไฟล์ต้นฉบับสำหรับการสำรวจครั้งถัดไป
ดำเนินการต่อ;
-
ถ้า (ispass) {
ถ้า (nums.size() % countAccuracy == 1 && nums.size() > 1) {
// จัดเรียงคอลเลกชัน
Collections.sort(ตัวเลข);
//รับข้อมูลที่ใหญ่ที่สุดและเขียนข้อมูลอื่นๆ ลงในไฟล์การเรียงลำดับทั้งหมด
temp = numberSortData (ตัวเลข, พาธไฟล์, จริง, countAccuracy,
bw);
nums = รายการลิงค์ใหม่();
nums.add(อุณหภูมิ);
ดำเนินการต่อ;
-
-
//บันทึกตำแหน่งของข้อมูลชุดถัดไป
// ตรวจสอบว่าไฟล์ทั้งสิบไฟล์ไม่มีข้อมูลหรือไม่
ถ้า (ispasses.size() == CountFile) {
Collections.sort(ตัวเลข);
temp = numberSortData (ตัวเลข, พาธไฟล์, จริง, countAccuracy, bw);
nums = รายการลิงค์ใหม่();
หยุดพัก;
-
-
bw.ปิด();
//ปิดสตรีมการเขียน
fs.ปิด();
//ปิด BufferedReaders ทั้งหมด
สำหรับ (ตัววนซ้ำ ตัววนซ้ำ = WriterLists.iterator(); iterator.hasNext();) {
BufferedReader object2 = (BufferedReader) iterator.next();
object2.ปิด();
-
//ปิด FileReader ทั้งหมด
สำหรับ (ตัววนซ้ำ ตัววนซ้ำ = WriterListFile.iterator(); iterator.hasNext();) {
วัตถุ FileReader = (FileReader) iterator.next();
วัตถุ.ปิด();
-
-
// จัดเรียงข้อมูลและเขียนลงในไฟล์สุดท้าย (การปรับความแม่นยำ)
วัตถุคงที่สาธารณะ numberSortData (รายการ LinkedList, String filePath,
ispass บูลีน, int countAccuracy, BufferedWriter fs) {
Object temp = 0; //บันทึกค่าสุดท้าย
int tempCount = 0; //บันทึกตำแหน่งข้อมูลที่เขียน
พยายาม {
สำหรับ (ตัววนซ้ำ ตัววนซ้ำ = list.iterator(); iterator.hasNext();) {
วัตถุ object = (Object) iterator.next();
// พิจารณาว่าเป็นตัวเลขสุดท้ายหรือไม่
ถ้า (tempCount == list.size() - 1) {
//ตัดสินว่าชุดมีไม่ถึง100
ถ้า (list.size() < countAccuracy + 1 && ispass) {
อุณหภูมิ = โมฆะ;
} อื่น {
อุณหภูมิ = วัตถุ;
หยุดพัก;
-
-
//เขียนลงแหล่งข้อมูล
fs.write(วัตถุ + "/r/n");
//ตัวห้อยของข้อมูลที่บันทึกไว้
อุณหภูมินับ++;
-
} จับ (IOException จ) {
e.printStackTrace();
-
อุณหภูมิกลับ;
-
-