Из-за ограничений файлов байт-кода java файлы классов не могут быть больше 64 000 iirc. (Они просто не предназначены для данных этого типа.)
Я бы загружал данные при запуске программы, используя что-то вроде следующих строк кода:
import java.io.*;
import java.util.*;
public class Test {
public static void main(String... args) throws IOException {
List<DataRecord> records = new ArrayList<DataRecord>();
BufferedReader br = new BufferedReader(new FileReader("data.txt"));
String s;
while ((s = br.readLine()) != null) {
String[] arr = s.split(" ");
int i = Integer.parseInt(arr[0]);
int j = Integer.parseInt(arr[1]);
records.add(new DataRecord(i, j, arr[0]));
}
}
}
class DataRecord {
public final int i, j;
public final String s;
public DataRecord(int i, int j, String s) {
this.i = i;
this.j = j;
this.s = s;
}
}
( NB: Сканер работает довольно медленно, поэтому не поддавайтесь искушению использовать его только потому, что он имеет простой интерфейс. Используйте некоторую форму BufferedReader и split или StringTokenizer.)
Эффективность, конечно, можно повысить, если вы преобразуете данные в двоичный формат. В этом случае вы можете использовать DataInputStream
(но не забудьте пройти через BufferedInputStream
или BufferedReader
)
В зависимости от того, как вы хотите получить доступ к данным, вам лучше хранить записи в хеш-карте (HashMap<Integer, DataRecord>
) (с ключом i
или j
).
Если вы хотите загрузить данные одновременно с тем, как JVM загружает сам файл класса (примерно!), Вы можете выполнить чтение / инициализацию не в методе, а заключить его в static { ... }
.
Для подхода с отображением памяти посмотрите на java.nio.channels
-пакет в java. Особенно метод
public abstract MappedByteBuffer map(FileChannel.MapMode mode, long position,long size) throws IOException
Полные примеры кода можно найти здесь .
Дэн Борнштейн (ведущий разработчик DalvikVM) объясняет решение вашей проблемы в этом выступлении (Посмотрите вокруг 0:30:00). Однако я сомневаюсь, что решение применимо к таким данным, как мегабайт.