【问题标题】:Android saving and loading 1D and 2D arrays of Strings and booleansAndroid 保存和加载字符串和布尔值的 1D 和 2D 数组
【发布时间】:2014-04-06 09:21:39
【问题描述】:

好的,所以在观看并阅读了几篇关于在内部存储中保存和加载标准变量的教程后,我感到非常困惑。基本上,我找不到任何有用的参考资料,这将告诉我更多相关信息。因为我没有使用 Java 的 IOStream 的经验,所以我正在寻找一些教程来解释我需要的一切,所以我会知道我在做什么,而不仅仅是复制+粘贴有效的代码,没人关心为什么。感谢您的每一个建议。

所以总结一下我想要的 - 我有字符串数组和布尔值的二维数组 (String foo[500]; boolean bool[10][20]),我想要做的是将它保存并加载到/来自内部存储。此外,在此 IO 流开始之前,我需要检查文件是否存在 - 如果不存在,则创建它们。

【问题讨论】:

    标签: java android arrays io


    【解决方案1】:

    听起来您可以使用共享首选项完成所有操作。您可以使用 SharedPreferences 来保存任何原始数据。

    以下内容详细介绍了实现细节,还包括文件 API 和外部存储解决方案以供查看:http://www.vogella.com/tutorials/AndroidFileBasedPersistence/article.html

    【讨论】:

      【解决方案2】:

      您必须使用字节缓冲区将变量存储到字节流中,然后将此缓冲区写入文件。 您必须导入以下内容:

      import java.io.FileInputStream;
      import java.io.FileOutputStream;
      import java.io.IOException;
      import java.nio.ByteBuffer;
      

      这是一个 3 步操作:1 分配缓冲区,2 将数据写入缓冲区,3 将缓冲区写入文件:

      // First you have to calculate the size of your strings in bytes
      int size = 0;
      // Assuming string is encoded in ASCII, so one byte for each
      // character, else you have to multiply the string size by the size
      // of a encoded character
      for (int i = 0; i < 500; i++)
          size += foo[i].length();
      
      // Allocating the buffer, 10 * 20 is your boolean array size, because
      // one boolean take one byte in memory
      ByteBuffer buffer = ByteBuffer.allocate(size + 10 * 20);
      
      // Put your strings into your buffer
      for (int i = 0; i < 500; i++)
          buffer.put(foo[i].getBytes());
      
      // To store boolean we will store 0 for false and 1 for true
      for (int i = 0; i < 10; i++)    {
          for (int j = 0; j < 20; j++)
              buffer.put((byte) (bool[i][j] ? 1 : 0));
      }
      
      // And finally write your buffer into your file
      try {
          // If file doesn't exist, it will be created
          FileOutputStream fos = openFileOutput("file", MODE_PRIVATE);
          // buffer.array is a 1D array of the bytes stored in the buffer
          fos.write(buffer.array());
          fos.close();
      } catch (IOException e) {
          e.printStackTrace();
      }
      

      【讨论】:

      • 谢谢,这很好!但是你能解释一下如何将字节检索回变量吗?另外,我只想让您知道,由于使用 UTF-8(2 个字节)作为字符,我将“大小”变量加倍。
      • 字节缓冲区是连续的字节流,没有分隔符,就像一个大数组。 array() 方法返回它,其中数据按照您放入 buf 的顺序存储。而且因为您存储了字符串,所以您不知道每个字符的大小,也不知道字节的大小,因此您无法取回您的变量——除非它们是固定大小的字符串——。您可以,如果您还为文件编写了每个字符串大小的索引(如果您想知道如何执行此操作,请自行搜索一下,如果您仍然不明白,请提出一个新问题)。无论如何,如果您喜欢这个答案,请随时投票:)。
      • 我有一个想法——我可以放一些特殊的值来将一个字符串与其他字符串分开,所以如果程序在读取缓冲区时找到这个值,它会增加字符串数组索引吗?现在的问题是 - 它应该是什么价值......
      • 抱歉,这不是一个好主意。您需要一个非常大的值(如 20 个字节),以确保它不能是包含在字符串中的值,即使您不走运,它也可能会失败。要建立索引,您必须在缓冲区中保存每个字符串的字节长度(例如,在一个短裤数组中)。然后,当您加载文件时,您将加载 500 个短裤的数组,然后您将加载每个字符串 [i],其大小为 shortArray[i]。它被称为索引。
      猜你喜欢
      • 2020-02-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-06-18
      • 2020-10-01
      • 2013-02-08
      • 2021-01-28
      相关资源
      最近更新 更多