我必须在文件中写字节数组。我不能一次做到这一点所以我不能把我的数组放在一个容器中。我的数组的大小也是可变的。 其次,文件非常庞大,所以我必须拆分它,以便按数组读取它。
我该怎么做?我试图逐行写我的字节数组,但我还没能。如何在我的数组之间放置一个分隔符并将其拆分为此分隔符?
编辑:
我试过了:
ByteArrayOutputStream bos = new ByteArrayOutputStream();
ObjectOutput out = new ObjectOutputStream(bos);
out.writeObject(byteArray);
但是,我多次执行此代码,因此ObjectOutputStream每次都会添加一个损坏文件的新标头。
我也试试:
out.write(byteArray);
但我无法分离我的数组。所以我试图附加一个'\ n',但没有用。之后我正在寻找像FileUtils这样的库,以便逐行写byte [],但我找不到。
答案 0 :(得分:7)
您可以使用现有的集合,例如列表保持byte []的列表并将其传送
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));
}
输出:
HI
BYE
另一个选择是使用RandomAccessFile。 这不会强迫您阅读完整文件,您可以跳过您不想阅读的数据。
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
}
输出:
BYE
答案 1 :(得分:1)
您必须在编码中描述您的数据。即添加一些元数据。
例如,数组的长度,然后是数组的数据。
这称为序列化。
Array of int: length(4 bytes), data[0] (4 bytes), data[1] (4 bytes), data[2] (4 bytes)
答案 2 :(得分:0)
有几种方法可以做到这一点。基本上首先要指出的是文件只是一个非结构化的字节序列。任何字节。基本上你想要o存储几个可变长度的字节数组。这意味着你必须以某种方式添加结构,然后在阅读时解析。
最简单的可能是使用一些您视为分隔符的字节序列(具体到足以使其在数据中显示的可能性很小)。
然后在写作时,首先简单地写你的字节,然后是分隔符
out.write(myarray);
out.write(separator);
out.write(anotherarray);
在阅读时,您需要使用某种可以检查的滑动窗口,以便您可以确定是否已阅读分隔符。基本上只是逐个遍历字节,并保留你在某个缓冲区中读取的最后几个字节。当您在缓冲区中看到分隔符时,您刚刚找到了数组的末尾。
另一种方法是使用一些描述长度的标题写一个固定长度的块,也可以用一些表示当前数组是否有另一个数据包。然后你只需读写整个块。