импортировать 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.Random;
общественный класс LargeMappedFiles {
/**
* Сортировка и объединение больших данных
*
* @param аргументы
*/
public static void main(String[] args) выдает IOException {
//Путь для записи файла
Строка filePath = "D://456";
// Путь к разделению файла
Строка sqlitFilePath = "D://456//123";
//Количество данных
интервал CountNumbers=10000000;
//Количество подфайлов
интервал 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("Каждый подфайл отсортирован!");
//Настройка точности, сравнение и интеграция десяти файловых данных
DeathDataFile (filePath, sqlitFilePath, countAccuracy, CountFile);
System.out.println("Интеграция завершена");
длинный stopNumber = System.currentTimeMillis ();
System.out.println("Требует времени"+(stopNumber-startNumber)/1000+"миллисекунды");
}
//Запись большого файла данных
public static void WriteData(String path,int CountNumbers) выдает IOException {
путь = путь + "//12114.txt";
FileWriter fs = новый FileWriter (путь);
BufferedWriter fw = новый BufferedWriter (фс);
for (int я = 0; я <CountNumbers; я++) {
fw.write(new Random().nextInt(Integer.MAX_VALUE) + "/r/n");
}
фв.закрыть();
фс.закрыть();
}
// Разделяем большой файл данных на десять других маленьких файлов
public static void sqlitFileDate(String filepath, String sqlitPath,
int CountFile) выдает IOException {
FileWriter фс = ноль;
BufferedWriter fw = null;
FileReader fr = новый FileReader(путь к файлу + "//12114.txt");
BufferedReader br = new BufferedReader(fr); // Читаем и получаем всю строку данных
интервал я = 1;
LinkedList WriterLists=new LinkedList(); //Инициализируем коллекцию объектов файлового потока
LinkedList fwLists = новый LinkedList ();
for (int j = 1; j <= CountFile; j++) {
//Объявляем объект
fs = новый FileWriter(sqlitPath + "//12" + j + ".txt",false);
fw = новый BufferedWriter (фс);
//Загружаем объект в коллекцию
WriterLists.add(фс);
fwLists.add(fw);
}
//Определяем, есть ли еще данные для возврата в файловом потоке
в то время как (br.ready()) {
int count=1;//Инициализируем первый файловый поток
for (Итератор итератор = fwLists.iterator(); iterator.hasNext();) {
Тип BufferedWriter = (BufferedWriter) iterator.next();
if(i==count)//Определяем, в какой файловый поток настала очередь записывать данные
{
//Запись данных, выход, переход к следующему файловому потоку и запись следующих данных
type.write(br.readLine() + "/r/n");
перерыв;
}
считать++;
}
//Определяем, достигнут ли последний файловый поток
если (я >= CountFile) {
я = 1;
} еще
я++;
}
бр.закрыть();
фр.закрыть();
for (Итератор итератор = fwLists.iterator(); iterator.hasNext();) {
Объект BufferedWriter = (BufferedWriter) iterator.next();
объект.закрыть();
}
//Обходим и закрываем все потоки подфайлов
for (Итератор итератор = WriterLists.iterator(); iterator.hasNext();) {
Объект FileWriter = (FileWriter) iterator.next();
объект.закрыть();
}
}
// Сортируем данные каждого файла
public static void SingleFileDataSort(String path1,int CountFile) выдает IOException {
LinkedList nums = null;
for (int i = 1; я <= CountFile; я++) {
nums = новый LinkedList();
Строковый путь = путь1 + "//12" + i + ".txt";
пытаться {
FileReader fr = новый FileReader (путь);
BufferedReader br = новый BufferedReader (fr);
в то время как (br.ready()) {
// Добавляем прочитанные отдельные данные в коллекцию
nums.add(Integer.parseInt(br.readLine()));
}
// Сортируем коллекцию
Коллекции.сортировать(числа);
//Записываем отсортированные данные в исходный файл
NumberSort (числа, путь);
бр.закрыть();
фр.закрыть();
} catch (NumberFormatException e) {
е.printStackTrace();
} catch (FileNotFoundException e) {
е.printStackTrace();
} catch (IOException e) {
е.printStackTrace();
}
}
}
// Сортируем данные каждого файла и затем записываем их в исходный файл
public static void NumberSort (список LinkedList, строковый путь) {
пытаться {
FileWriter fs = новый FileWriter (путь);
BufferedWriter fw = новый BufferedWriter (фс);
for (Итератор итератор = list.iterator(); iterator.hasNext();) {
Объект объект = (Объект) iterator.next();
fw.write(объект + "/r/n");
}
фв.закрыть();
фс.закрыть();
} catch (IOException e) {
е.printStackTrace();
}
}
//Окончательная интеграция данных файла (регулировка точности)
public static void deathDataFile(String filepath, String sqlitFilePath1,
int countAccuracy, int CountFile) выдает IOException {
LinkedList nums = new LinkedList(); //Добавляем данные и сортируем
Object temp = null // Записываем последнее число, оставшееся в каждой сортировке;
логическое значение ispass = ложь;
LinkedList ispasses = null //Запись информации о состоянии файла данных;
FileWriter fs = new FileWriter(filepath + "//Sort.txt", false); //Создаем файловый поток для интегрированной записи данных;
BufferedWriter bw = новый BufferedWriter (фс);
FileReader fr = null //Объявляем поток чтения файла;
BufferedReader br = null // Объявить BufferedReader;
LinkedList WriterLists = new LinkedList(); // Инициализируем коллекцию объектов файлового потока.
LinkedList WriterListFile = новый LinkedList();
for (int j = 1; j <= CountFile; j++) {
// Объявляем объект и открываем все потоки подфайлов для доступа к данным всех подфайлов
fr = новый FileReader(sqlitFilePath1 + "//12" + j + ".txt");
//Открываем все BufferedReaders, чтобы в следующий раз облегчить чтение всей строки
br = новый BufferedReader (фр);
//Загружаем все объекты FileReader в коллекцию
WriterListFile.add(fr);
//Загружаем все объекты BufferedReader в коллекцию
WriterLists.add(br);
}
для (;;) {
// Сохраняем статус данных десяти исходных файлов в коллекцию, чтобы облегчить последующее суждение.
ispasses = новый LinkedList();
// Читаем отдельные данные из десяти исходных файлов соответственно
for (Итератор итератор = WriterLists.iterator(); iterator.hasNext();) {
Объект BufferedReader = (BufferedReader) iterator.next();
Объект объект = ноль;
в то время как (object.ready()) {
//Добавляем данные для каждого файлового потока
nums.add(Integer.parseInt(object.readLine().toString()));
перерыв;
}
если (object.ready() == false)
ispasses.add("true"); //Сохраняем статус данных в каждом файле в коллекцию
}
// Определяем, заходим ли мы в первый раз
if (nums.size() % countAccuracy == 0 && ispass == false) {
// Сортируем коллекцию
Коллекции.сортировать(числа);
//Получаем самые большие данные и записываем остальные данные в общий файл сортировки
temp = NumberSortData (nums, filepath, false, countAccuracy, bw);
//Повторно инициализируем коллекцию
nums = новый LinkedList();
//Добавляем оставшиеся данные из предыдущего набора сравнений
nums.add(темп);
Испас = Истина;
//Записываем количество данных исходного файла для следующего обхода
продолжать;
}
если (испасс) {
if (nums.size() % countAccuracy == 1 && nums.size() > 1) {
// Сортируем коллекцию
Коллекции.сортировать(числа);
//Получаем самые большие данные и записываем остальные данные в общий файл сортировки
temp = NumberSortData(nums, filepath, true, countAccuracy,
чб);
nums = новый LinkedList();
nums.add(темп);
продолжать;
}
}
//Записываем местоположение следующего набора данных
// Определяем, все ли десять файлов не содержат данных
if (ispasses.size() == CountFile) {
Коллекции.сортировать(числа);
temp = NumberSortData (nums, filepath, true, countAccuracy, bw);
nums = новый LinkedList();
перерыв;
}
}
чб.закрыть();
//Закрываем поток записи
фс.закрыть();
//Закрываем все BufferedReaders
for (Итератор итератор = WriterLists.iterator(); iterator.hasNext();) {
BufferedReader object2 = (BufferedReader) iterator.next();
объект2.закрыть();
}
//Закрываем все FileReaders
for (Итератор итератор = WriterListFile.iterator(); iterator.hasNext();) {
Объект FileReader = (FileReader) iterator.next();
объект.закрыть();
}
}
// Сортируем данные и записываем их в окончательный файл (регулировка точности)
общедоступный статический номер объектаSortData (список LinkedList, String filePath,
логическое значение ispass, int countAccuracy,BufferedWriter fs) {
Object temp = 0 //Записываем последнее значение
int tempCount = 0 // Записываем место записи данных
пытаться {
for (Итератор итератор = list.iterator(); iterator.hasNext();) {
Объект объект = (Объект) iterator.next();
// Определяем, является ли это последним числом
if (tempCount == list.size() - 1) {
// Решение о том, что в наборе меньше 100
if (list.size() < countAccuracy + 1 && ispass) {
температура = ноль;
} еще {
температура = объект;
перерыв;
}
}
//Запись в источник данных
fs.write(объект + "/r/n");
//Индекс записанных данных
темпКаунт++;
}
} catch (IOException e) {
е.printStackTrace();
}
температура возврата;
}
}