18.11.2013 10:34
0 34 0
Исключение удалённых и заблокированных персонажей. Часть2.
В этой статье я покажу один из вариантов использования файла со списком исключений.
Для этого создадим новый класс. Назовём его ExceptionHeroFile. Для вытаскивания информации из файла потребуются следующие инструменты:
File F;
FileInputStream Input;
InputStreamReader IReader;
BufferedReader Reader;
Это по порядку: файл, поток, в который он загружается, ридер, который читает из потока и BufferedReader (не знаю как это расшифровать), который преобразует прочитанную информацию в удобный вид и передаёт её необходимыми порциями. В конструкторе класса произведём инициализацию всех этих объектов. В качестве параметра передадим конструктору название файла, в котором список исключений.
public ExceptionHeroFile(String fileName) {
Input = null;
try {
F = new File(fileName);
Input = new FileInputStream(F);
IReader = new InputStreamReader(Input);
Reader = new BufferedReader(IReader);
} catch (Exception ex) {
ex.printStackTrace();
}
}
И определим один метод, который будет возвращать следующий id в файле. В файле информация лежит построчно, значит для её чтения будем использовать метод readLine(). Когда файл закончится, возвращать будем -1.
public int getNextID() {
int result = -1;
try {
result = Integer.parseInt(Reader.readLine());
if (result < 0) result *= -1;
} catch (Exception ex) {}
return result;
}
Этот класс позволяет исключать из перебора id в списке, причём не нужно в память загружать весь более чем 40-мегабайтовый файл с исключениями. Ну и пример использования этого класса:
Инициализация:
int start = 1;
int stop = 5571073;
ExceptionHeroFile blockedFile = new ExceptionHeroFile("blocked.txt");
int blockedID = blockedFile.getNextID();
Ищем в файле первый id больше начального:
while (blockedID < start) {
blockedID = blockedFile.getNextID();
if (blockedID == -1) break;
}
Собственно цикл с исключением:
for (int i = start; i < stop; i++) {
if (i == blockedID) {
blockedID = blockedFile.getNextID();
continue;
}
...
}
P.S. Для того, чтобы это всё работало, файл должен быть отсортирован. В тех файлах, ссылки на которые я приводил, информация уже отсортирована. Но если будете там что-то дополнять, необходимо это учесть.
Для этого создадим новый класс. Назовём его ExceptionHeroFile. Для вытаскивания информации из файла потребуются следующие инструменты:
File F;
FileInputStream Input;
InputStreamReader IReader;
BufferedReader Reader;
Это по порядку: файл, поток, в который он загружается, ридер, который читает из потока и BufferedReader (не знаю как это расшифровать), который преобразует прочитанную информацию в удобный вид и передаёт её необходимыми порциями. В конструкторе класса произведём инициализацию всех этих объектов. В качестве параметра передадим конструктору название файла, в котором список исключений.
public ExceptionHeroFile(String fileName) {
Input = null;
try {
F = new File(fileName);
Input = new FileInputStream(F);
IReader = new InputStreamReader(Input);
Reader = new BufferedReader(IReader);
} catch (Exception ex) {
ex.printStackTrace();
}
}
И определим один метод, который будет возвращать следующий id в файле. В файле информация лежит построчно, значит для её чтения будем использовать метод readLine(). Когда файл закончится, возвращать будем -1.
public int getNextID() {
int result = -1;
try {
result = Integer.parseInt(Reader.readLine());
if (result < 0) result *= -1;
} catch (Exception ex) {}
return result;
}
Этот класс позволяет исключать из перебора id в списке, причём не нужно в память загружать весь более чем 40-мегабайтовый файл с исключениями. Ну и пример использования этого класса:
Инициализация:
int start = 1;
int stop = 5571073;
ExceptionHeroFile blockedFile = new ExceptionHeroFile("blocked.txt");
int blockedID = blockedFile.getNextID();
Ищем в файле первый id больше начального:
while (blockedID < start) {
blockedID = blockedFile.getNextID();
if (blockedID == -1) break;
}
Собственно цикл с исключением:
for (int i = start; i < stop; i++) {
if (i == blockedID) {
blockedID = blockedFile.getNextID();
continue;
}
...
}
P.S. Для того, чтобы это всё работало, файл должен быть отсортирован. В тех файлах, ссылки на которые я приводил, информация уже отсортирована. Но если будете там что-то дополнять, необходимо это учесть.