当前位置: 首页 > 知识库问答 >
问题:

Java在文件中存储布尔数组并快速读取

孙才捷
2023-03-14

我需要在文件中存储包含80000项的布尔数组。我不在乎节省多少时间,我只关心数组的加载时间。我没有尝试通过DataOutputStream存储它,因为它需要访问每个值。

我试图通过3种方法来做到这一点,例如:

    < li >序列化布尔数组 < li >使用BitSet代替布尔数组并将其序列化 < li >将布尔数组转换为字节数组,其中1为真,0为假,并使用ByteBuffer通过FileChannel写入它

为了测试通过这些方法从文件中读取数据,我在循环中运行了每种方法1000次。所以我得到了这样的结果:

  1. 布尔数组的反序列化需要 574 毫秒
  2. 位集的反序列化 - 379 ms
  3. 通过映射字节缓冲区从文件通道获取字节数组 - 170 毫秒

第一种和第二种方法太长,第三种可能根本不是方法。

也许有最好的方法来完成它,所以我需要你的建议

编辑

每个方法运行一次

  1. 13.8
  2. 8.71
  3. 6.46 ms适当

共有2个答案

洪俊能
2023-03-14

所以我有一个非常相似的用例,我想序列化/反序列化一个非常大的布尔数组。

我实现了这样的东西,首先,我将布尔数组转换为整数数组,只是为了合并多个布尔值(这使得存储更有效率并且没有位填充问题)
现在这意味着我们必须构建包装器方法,这些方法将给出真/假

    private boolean get (int index) {
        int holderIndex = (int) Math.floor(index/buckets);
        int internalIndex = index % buckets;
        return 0 != (container[holderIndex] & (1 << internalIndex));
    }

    private void set (int index) {
        int holderIndex = (int) Math.floor(index/buckets);
        int internalIndex = index % buckets;
        int value = container[holderIndex];
        int newValue = value | (1 << internalIndex);
        container[holderIndex] = newValue;
    }

现在要序列化和反序列化,可以直接将其转换为ByTestStream并写入文件。

我的源码,供参考

秦焱
2023-03-14

为每个布尔值编写一个字节并开发一个自定义解析器怎么样?这可能是最快的方法之一。如果您想节省空间,也可以将8个布尔值放入一个字节,但这需要一些位移位操作。

下面是一个简短的示例代码:

public void save() throws IOException
{
    boolean[] testData = new boolean[80000];
    for(int X=0;X < testData.length; X++)
    {
        testData[X] = Math.random() > 0.5;
    }
    FileOutputStream stream = new FileOutputStream(new File("test.bin"));

    for (boolean item : testData)
    {
        stream.write(item ? 1 : 0);
    }
    stream.close();
}

public boolean[] load() throws IOException
{
    long start = System.nanoTime();
    File file = new File("test.bin");
    FileInputStream inputStream = new FileInputStream(file);
    int fileLength = (int) file.length();

    byte[] data = new byte[fileLength];
    boolean[] output = new boolean[fileLength];

    inputStream.read(data);
    for (int X = 0; X < data.length; X++)
    {
        if (data[X] != 0)
        {
            output[X] = true;
            continue;
        }
        output[X] = false;
    }
    long end = System.nanoTime() - start;
    Console.log("Time: " + end);
    return output;
}

加载 80.000 个布尔值大约需要 2 毫秒。使用 JDK 1.8.0_45 进行测试

 类似资料:
  • 问题内容: 我知道如何使用和File IOException 读取文件,但是我唯一不知道的是如何将文本作为数组存储在文件中。 这是我的代码: 这是我的文件包含的内容: 问题答案: 存储为字符串: 对于花车:

  • 如何从包含大量数字的文本文件中读取并将其存储到int数组中,最后将该数组和数组大小传递给应用程序中使用的其他方法。到目前为止,我的代码读取文本文件并将其存储到ArrayList中,而不是数组中。谢谢你。

  • 读取行和数字并将其存储到数组X中,但数组只到位置0和1,当它改变行时,它只将新的数字(例如NUM 3)写入旧数字所在的位置(例如pos 0中的NUM 1) 有什么解决办法吗?

  • 问题内容: 我正在编写一个简单的子手程序。我在打开文件,然后将数据存储到数组时遇到困难。我似乎不知道该怎么做。这是针对学校项目的,因此,如果逻辑似乎不必要,请怪男人:) 我有一个包含十个单词的文本文件(words.txt)。它们在文件中,并且每个文件之间都有一行。它们需要导入到数组中。有人愿意帮助一个有抱负的年轻程序员吗?谢谢你提供的所有帮助! 问题答案: 我建议您使用(例如)和(使用构造它,然后

  • 我有一个csv文件,标题在第一行,其值在所有石灰中。 标题应该是:标题1,标题2,标题3,。。。。 如果总共有200行,我将得到199个header1,header2值。 我试图将每个标头的所有值存储在一个数组中。 我试过的代码, 这样做的时候,我每行得到200个阵列。 如果假设有七个标头,我需要七个包含199个元素的数组。 顺便说一句,我不需要所有的标题值,我只需要一些标题,我可以通过拆分第一行

  • 问题内容: 我需要创建一个数组来添加具有这种格式的对象,例如Swift中的字典:[“ key1”:“ value1”,“ key2”:“ value2”] 当我尝试全部保存时是正确的,但是使用键读取时会崩溃。var obj需要什么类型的数据? 问题答案: 这个问题的意思是“数组数组”,但是我想大多数人可能只是想知道如何将数组保存到。对于那些人,我将添加一些常见示例。 保存数组 检索数组 整数数组