Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/183.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Android保存和加载字符串和布尔值的一维和二维数组_Java_Android_Arrays_Io - Fatal编程技术网

Java Android保存和加载字符串和布尔值的一维和二维数组

Java Android保存和加载字符串和布尔值的一维和二维数组,java,android,arrays,io,Java,Android,Arrays,Io,好的,在看了几篇关于将标准变量保存和加载到内部存储器或从内部存储器加载标准变量的教程后,我完全搞糊涂了。基本上,我找不到任何有用的参考资料,这将告诉我更多关于这一点。因为我没有从Java使用IOStream的经验,所以我正在寻找一些教程来解释我所需要的一切,这样我就知道我在做什么,而不仅仅是复制+粘贴可以工作的代码,没有人关心为什么。谢谢你的建议 因此,为了总结我想要的内容-我有字符串数组和布尔值的2D数组(字符串foo[500];布尔值bool[10][20]),我想做的是将其保存并加载到内部

好的,在看了几篇关于将标准变量保存和加载到内部存储器或从内部存储器加载标准变量的教程后,我完全搞糊涂了。基本上,我找不到任何有用的参考资料,这将告诉我更多关于这一点。因为我没有从Java使用IOStream的经验,所以我正在寻找一些教程来解释我所需要的一切,这样我就知道我在做什么,而不仅仅是复制+粘贴可以工作的代码,没有人关心为什么。谢谢你的建议


因此,为了总结我想要的内容-我有字符串数组和布尔值的2D数组(字符串foo[500];布尔值bool[10][20]),我想做的是将其保存并加载到内部存储器中。此外,在这个IO流开始之前,我需要检查文件是否存在——如果不存在,那么创建它们。

听起来像是可以通过共享首选项来完成的。您可以使用SharedReferences保存任何基本数据


下面介绍了实现细节,还包括要查看的文件API和外部存储解决方案:

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

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();
}
//首先,您必须以字节为单位计算字符串的大小
int size=0;
//假设字符串是用ASCII编码的,那么每个字符串对应一个字节
//字符,否则必须将字符串大小乘以
//编码字符的
对于(int i=0;i<500;i++)
size+=foo[i].length();
//分配缓冲区时,10*20是您的布尔数组大小,因为
//一个布尔值占用内存中的一个字节
ByteBuffer缓冲区=ByteBuffer.allocate(大小+10*20);
//将字符串放入缓冲区
对于(int i=0;i<500;i++)
put(foo[i].getBytes());
//为了存储布尔值,我们将存储0表示false,存储1表示true
对于(int i=0;i<10;i++){
对于(int j=0;j<20;j++)
buffer.put((字节)(bool[i][j]?1:0));
}
//最后将缓冲区写入文件
试一试{
//如果文件不存在,将创建该文件
FileOutputStream fos=openFileOutput(“文件”,模式为私有);
//buffer.array是存储在缓冲区中的字节的1D数组
fos.write(buffer.array());
fos.close();
}捕获(IOE异常){
e、 printStackTrace();
}

谢谢,这非常好!但是你能解释一下如何将字节检索回变量吗?另外,我只想让你知道,由于使用UTF-8(2字节)作为字符,我将“size”变量翻了一番。字节缓冲区是一个连续的字节流,没有定界,就像一个大数组。array()方法返回它,其中数据按放入buf的顺序存储。因为你存储了字符串,你不知道每个字符串的大小,也不知道它们的字节数,所以你无法检索你的变量,除非它们是固定大小的字符串。如果您还为文件编写了每个字符串大小的索引(如果您想知道如何执行此操作,请自己搜索一下,如果您仍然不理解,请提出一个新问题),则可以这样做。无论如何,如果你喜欢这个答案,请随意投票:)。我有一个主意-我可以放一些特殊的值,将一个字符串与其他字符串分开,所以如果程序在读取缓冲区时发现这个值,它会增加字符串数组索引吗?现在的问题是-它应该有什么价值…抱歉,但这不是一个好主意。您需要一个非常大的值(比如20字节),以确保它不能是包含在字符串中的值,即使您运气不好,它也可能失败。要构建索引,您必须在缓冲区中以字节为单位保存每个字符串的长度(例如,在短数组中)。然后,当您加载文件时,您将加载包含500个短字符的数组,然后您将加载每个字符串[i]的大小短字符数组[i]。这叫做索引。