Скажем, у вас есть логическое значение []
boolean[] ar = {true,false,false,true,false,true,true,true,false,true,false,false,false,true,true};
и вы хотите записать это на диск, и вам все равно, как это реализовано в памяти.
public static void main(String... args) throws IOException {
boolean[] ar = {true, false, false, true, false, true, true, true, false, true, false, false, false, true, true};
FileOutputStream out = new FileOutputStream("test.dat");
writeBooleans(out, ar);
out.close();
FileInputStream in = new FileInputStream("test.dat");
boolean[] ar2 = new boolean[ar.length];
readBooleans(in, ar2);
in.close();
System.out.println(Arrays.toString(ar));
System.out.println(Arrays.toString(ar2));
System.out.println("The file size was "+new File("test.dat").length()+" bytes.");
}
private static void writeBooleans(OutputStream out, boolean[] ar) throws IOException {
for (int i = 0; i < ar.length; i += 8) {
int b = 0;
for (int j = Math.min(i + 7, ar.length-1); j >= i; j--) {
b = (b << 1) | (ar[j] ? 1 : 0);
}
out.write(b);
}
}
private static void readBooleans(InputStream in, boolean[] ar) throws IOException {
for (int i = 0; i < ar.length; i += 8) {
int b = in.read();
if (b < 0) throw new EOFException();
for (int j = i; j < i + 8 && j < ar.length; j++) {
ar[j] = (b & 1) != 0;
b >>>= 1;
}
}
}
печать
[true, false, false, true, false, true, true, true, false, true, false, false, false, true, true]
[true, false, false, true, false, true, true, true, false, true, false, false, false, true, true]
The file size was 2 bytes.
но если я посмотрим, насколько большой файл на самом деле
$ ls -l test.dat
-rw-rw-r-- 1 peter peter 2 2012-02-19 14:04 test.dat
$ du -h test.dat
4.0K test.dat
В нем указано, что длина составляет 2 байта, но фактически используемое дисковое пространство составляет 4 КБ.
Примечание. Около 1 минуты вашего времени стоит примерно столько же, сколько 80 МБ SSD (дорогой диск, больше для жесткого диска). Поэтому, если вы не думаете, что сэкономите по крайней мере 80 МБ, вы можете тратить свое время. ;)
Вы можете использовать BitSet, который может занимать в 16 раз меньше места, поскольку каждый символ является 16-разрядным.