gpt4 book ai didi

java - 如何在 Java 中将 boolean 数组转换为二进制数组,反之亦然?

转载 作者:塔克拉玛干 更新时间:2023-11-01 21:41:38 24 4
gpt4 key购买 nike

用 Java 将 boolean 数组输出到文件(并从文件输入)的最有效方法是什么?我打算使用一个字符串,每个字符要么是“t”,要么是“f”,然后我想,为什么不减少八倍的空间呢?

注意

我实际上不知道哪个答案是更好的方法,我只是选择了 Peter 的,因为我理解它。感谢两位回答者!

最佳答案

假设你有一个 boolean 值[]

boolean[] ar = {true,false,false,true,false,true,true,true,false,true,false,false,false,true,tr‌​ue};

并且您想将其写入磁盘,而不关心它在内存中的实现方式。

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 KB。

注意:大约 1 分钟的时间相当于 80 MB 的 SSD(昂贵的磁盘,HDD 的更多)因此,如果您认为使用它至少不会节省 80 MB,您可以浪费你的时间。 ;)


您可以使用 BitSet,它可以减少 16 倍的空间,因为每个字符都是 16 位的。

关于java - 如何在 Java 中将 boolean 数组转换为二进制数组,反之亦然?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9349519/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com