好的,所以我使用BinaryWriter将文件转换为二进制格式。格式为:
整数,然后是整数。
因此代码将类似于:
readLineOfNumbers() {
count = read();
int[] a = read(count ints);
return a;
}
我是否使用BinaryReader?我能看到的最接近的事情是将所有内容读入byte [],但是如何将其作为一个int数组呢?这一切都必须非常有效地完成。我需要缓冲等等。
答案 0 :(得分:2)
如果使用BinaryWriter创建文件,则使用BinaryReader
读取它是有意义的类似的东西:
private static int[] ReadArray(BinaryReader reader)
{
int count = reader.ReadInt32();
int[] data = new int[count];
for (int i = 0; i < count; i++)
{
data[i] = reader.ReadInt32();
}
return data;
}
答案 1 :(得分:1)
int[] original = { 1, 2, 3, 4 }, copy;
byte[] bytes;
using (var ms = new MemoryStream())
{
using (var writer = new BinaryWriter(ms))
{
writer.Write(original.Length);
for (int i = 0; i < original.Length; i++)
writer.Write(original[i]);
}
bytes = ms.ToArray();
}
using (var ms = new MemoryStream(bytes))
using (var reader = new BinaryReader(ms))
{
int len = reader.ReadInt32();
copy = new int[len];
for (int i = 0; i < len; i++)
{
copy[i] = reader.ReadInt32();
}
}
虽然我个人只是从w {o BinaryReader
开始阅读。
实际上,严格说话,如果是我,我会使用我的own serializer,只是:
[ProtoContract]
public class Foo {
[ProtoMember(1, Options = MemberSerializationOptions.Packed)]
public int[] Bar {get;set;}
}
因为这将具有已知的字节序,处理缓冲,并且如果大多数数字不是很大,将使用可变长度编码来帮助减少膨胀。
答案 2 :(得分:1)
我不知道BinaryReader
中会读取整数数组的任何内容,我担心。如果您读入字节数组,则可以使用Buffer.BlockCopy
将这些字节复制到int[]
,这可能是最快的转换形式 - 尽管它依赖于处理器的字节顺序适合您的数据
您是否尝试只是循环,根据需要多次调用BinaryReader.ReadInt32()
,并让文件系统进行缓冲?如果你认为这会有所帮助,你总是可以在混合中添加一个带有大缓冲区的BufferedStream
。