使用Java在文件中写入和读取多字节[]

使用Java在文件中写入和读取多字节[],java,file,bytearray,Java,File,Bytearray,我必须在文件中写入字节数组。我不能一次性完成,所以我不能将数组放入容器中。我的数组的大小也是可变的。 第二,文件非常大,所以我必须将其拆分,以便逐数组读取 我该怎么做?我试着逐行写我的字节数组,但一直没能。如何在数组之间放置分隔符,以及在拆分后如何在此分隔符上放置分隔符 编辑: 我试过这个: ByteArrayOutputStream bos = new ByteArrayOutputStream(); ObjectOutput out = new ObjectOutputStream(bos)

我必须在文件中写入字节数组。我不能一次性完成,所以我不能将数组放入容器中。我的数组的大小也是可变的。 第二,文件非常大,所以我必须将其拆分,以便逐数组读取

我该怎么做?我试着逐行写我的字节数组,但一直没能。如何在数组之间放置分隔符,以及在拆分后如何在此分隔符上放置分隔符

编辑:

我试过这个:

ByteArrayOutputStream bos = new ByteArrayOutputStream();
ObjectOutput out = new ObjectOutputStream(bos);
out.writeObject(byteArray);
但是,我多次执行此代码,因此ObjectOutputStream每次都会添加损坏文件的新头

我还尝试:

out.write(byteArray);

但我无法分离阵列。因此,我尝试附加一个'\n',但无效。为了逐行写入byte[]而查找类似于库的FileUtils,但我没有找到。

您必须在编码中描述数据。i、 e.添加一些元数据

例如,数组的长度,然后是数组的数据

这称为序列化

Array of int: length(4 bytes), data[0] (4 bytes), data[1] (4 bytes), data[2] (4 bytes)

您可以使用现有集合(如List)来维护字节[]的列表并传输它

    List<byte[]> list = new ArrayList<byte[]>();
    list.add("HI".getBytes());
    list.add("BYE".getBytes());

    ObjectOutputStream out = new ObjectOutputStream(new FileOutputStream(
            "test.txt"));
    out.writeObject(list);

    ObjectInputStream in = new ObjectInputStream(new FileInputStream(
            "test.txt"));
    List<byte[]> byteList = (List<byte[]>) in.readObject();

    //if you want to add to list you will need to add to byteList and write it again
    for (byte[] bytes : byteList) {
        System.out.println(new String(bytes));
    }
另一个选择是使用这不会强制您读取完整的文件,您可以跳过不想读取的数据。

     DataOutputStream dataOutStream = new DataOutputStream(
            new FileOutputStream("test1"));
    int numberOfChunks = 2;
    dataOutStream.writeInt(numberOfChunks);// Write number of chunks first
    byte[] firstChunk = "HI".getBytes();
    dataOutStream.writeInt(firstChunk.length);//Write length of array a small custom protocol
    dataOutStream.write(firstChunk);//Write byte array

    byte[] secondChunk = "BYE".getBytes();
    dataOutStream.writeInt(secondChunk.length);//Write length of array
    dataOutStream.write(secondChunk);//Write byte array

    RandomAccessFile randomAccessFile = new RandomAccessFile("test1", "r");
    int chunksRead = randomAccessFile.readInt();
    for (int i = 0; i < chunksRead; i++) {
        int size = randomAccessFile.readInt();
        if (i == 1)// means we only want to read last chunk
        {
            byte[] bytes = new byte[size];
            randomAccessFile.read(bytes, 0, bytes.length);
            System.out.println(new String(bytes));
        }
        randomAccessFile.seek(4+(i+1)*size+4*(i+1));//From start so 4 int + i* size+ 4* i ie. size of i
    }

有几种方法可以做到这一点。首先要指出的是,文件只是一个非结构化的字节序列。任何字节。基本上,您需要存储几个可变长度的字节数组。这意味着您必须以某种方式添加结构,然后在阅读时对其进行解析

最简单的方法可能是使用一些字节序列作为分隔符(足够具体,否则它在数据中出现的概率很低)

然后在写入时,首先简单地写入字节,然后是分隔符

out.write(myarray);
out.write(separator);
out.write(anotherarray);
在阅读时,您需要使用某种滑动窗口进行检查,以便确定是否已阅读分隔符。基本上只需逐个迭代字节,并将最后读取的几个字节保留在某个缓冲区中。当您在缓冲区中看到分隔符时,您刚刚找到了数组的结尾


另一种方法是使用描述长度的头写入固定长度的块,可能还有一位用于指示当前数组是否有另一个数据包。然后您只需读写整个模块。

显示一些代码,并告诉我们您尝试了什么。否则,我预测会有一场投票狂潮。好的,谢谢你的建议。给我点时间duplicate@pith看一下答案中的第二个代码段。我想这就是你需要的。真的吗?这就是序列化?它是序列化的一种形式,尽管通常只添加反序列化和重新创建对象(或数组)所需的元数据。如何处理这个问题:我将分隔符放入数组中?
BYE
out.write(myarray);
out.write(separator);
out.write(anotherarray);