C# 如何将字节数组读入文件流

C# 如何将字节数组读入文件流,c#,C#,我有一个字节数组,我想把字节数组读入一个文件流。下面是我的代码示例: string fileName = "test.txt"; byte[] file = File.ReadAllBytes(Server.MapPath("~/Files/" + fileName)); FileStream fs = new FileStream(); fs.ReadByte(file); object obj = LoadFile<object>(fs); public static T Lo

我有一个字节数组,我想把字节数组读入一个文件流。下面是我的代码示例:

string fileName = "test.txt";
byte[] file = File.ReadAllBytes(Server.MapPath("~/Files/" + fileName));
FileStream fs = new FileStream();
fs.ReadByte(file);
object obj = LoadFile<object>(fs);

public static T LoadFile<T>(FileStream fs)
{
    using (GZipStream gzip = new GZipStream(fs, CompressionMode.Decompress))
    {
        BinaryFormatter bf = new BinaryFormatter();
        return (T)bf.Deserialize(gzip);
    }
}
string fileName=“test.txt”;
byte[]file=file.ReadAllBytes(Server.MapPath(“~/Files/”+fileName));
FileStream fs=newfilestream();
fs.ReadByte(文件);
对象obj=加载文件(fs);
公共静态T加载文件(FileStream fs)
{
使用(GZipStream gzip=newgzipstream(fs,CompressionMode.Decompress))
{
BinaryFormatter bf=新的BinaryFormatter();
返回(T)bf.反序列化(gzip);
}
}

在上面的方法中,我使用FileStream读取字节数组,但不幸的是fs.ReadByte无法读取字节数组。任何帮助请关注如何将字节数组读入FileStream,以便用作方法“LoadFile”中的参数。请不要直接将文件读入FileStream,因为此处的文件是从其他地方加载的,例如从数据库或其他源加载的。

为什么要运行
文件。在使用
FileStream
之前,请先运行ReadAllBytes

string fileName = "test.txt";
using(FileStream fs = new FileStream(Server.MapPath("~/Files/" + fileName), FileMode.Open, FileAccess.Read))
{
    object obj = LoadFile<object>(fs);
    fs.Close();
}
string fileName=“test.txt”;
使用(FileStream fs=newfilestream(Server.MapPath(“~/Files/”+fileName)、FileMode.Open、FileAccess.Read))
{
对象obj=加载文件(fs);
fs.Close();
}

我不确定误解在哪里。FileStream表示磁盘上的文件。如果不将字节写入磁盘,则无法“读取字节”,如果不从磁盘读取,则无法从中读取字节

也许你想要的是一个可以包含任意内容的MemoryStream


两者都源于流。

耶!在做了更多的研究之后,我得到了一个很好的解决方案。正如我发布的主题“如何将字节数组读入文件流”。我们无法将字节数组读入FileStream,它只用于读取驱动程序到字节数组上的文件。所以我对代码做了一些修改,现在我有了一个文件,可以使用FileStream读取它。我是如何制作文件的

string fileName = "test.txt";
byte[] file = File.ReadAllBytes(Server.MapPath("~/Files/" + fileName));
MemoryStream memStream = new MemoryStream();
BinaryFormatter binForm = new BinaryFormatter();
memStream.Write(file, 0, file.Length);
memStream.Seek(0, SeekOrigin.Begin);
Object obj = (Object)binForm.Deserialize(memStream);
在这种情况下,我有一个对象。这个物体是你想要的任何东西

我将集合用作samble对象

Collection<object> list = new Collection<object>();
//Now I will write this list to a file. fileName is what you want and be sure that folder Files is exist on server or at the root folder of your project
WriteFile(list, Server.MapPath("~/Files/" + fileName));
//The method to write object to file is here
public static void WriteFile<T>(T obj, string path)
{
    FileStream serializeStream = new FileStream(path, FileMode.Create);
    BinaryFormatter bf = new BinaryFormatter();
    bf.Serialize(serializeStream, obj);
    serializeStream.Flush();
    serializeStream.Close();
}
集合列表=新集合();
//现在我将把这个列表写入一个文件。文件名是您想要的,请确保文件夹文件存在于服务器上或项目的根文件夹中
WriteFile(列表,Server.MapPath(“~/Files/”+fileName));
//将对象写入文件的方法如下
公共静态void WriteFile(T对象,字符串路径)
{
FileStream serializeStream=newfilestream(路径,FileMode.Create);
BinaryFormatter bf=新的BinaryFormatter();
序列化(serializeStream,obj);
序列化stream.Flush();
序列化stream.Close();
}
将对象写入文件后,需要一个方法将其读回对象。所以我写了这个方法:

public static Collection<object> ReatFile(string fileName){
            //I have to read the file which I have wrote to an byte array            
            byte[] file;
            using (var stream = new FileStream(Server.MapPath("~/Files/" + fileName), FileMode.Open, FileAccess.Read))
            {
                using (var reader = new BinaryReader(stream))
                {
                    file = reader.ReadBytes((int)stream.Length);

                }

            }
            //And now is what I have to do with the byte array of file is to convert it back to object which I have wrote it into a file
            //I am using MemoryStream to convert byte array back to the original object.
            MemoryStream memStream = new MemoryStream();
            BinaryFormatter binForm = new BinaryFormatter();
            memStream.Write(file, 0, file.Length);
            memStream.Seek(0, SeekOrigin.Begin);
            Object obj = (Object)binForm.Deserialize(memStream);
            Collection<object> list = (Collection<object>)obj;
            return list;
}
公共静态集合文件(字符串文件名){
//我必须读取写入字节数组的文件
字节[]文件;
使用(var stream=newfilestream(Server.MapPath(“~/Files/”+fileName)、FileMode.Open、FileAccess.Read))
{
使用(变量读取器=新二进制读取器(流))
{
file=reader.ReadBytes((int)stream.Length);
}
}
//现在我要对文件的字节数组做的就是把它转换回我写进文件的对象
//我正在使用MemoryStream将字节数组转换回原始对象。
MemoryStream memStream=新的MemoryStream();
BinaryFormatter binForm=新的BinaryFormatter();
memStream.Write(file,0,file.Length);
memStream.Seek(0,SeekOrigin.Begin);
objectobj=(Object)binForm.Deserialize(memStream);
集合列表=(集合)对象;
退货清单;
}

在完成上述步骤后,我现在可以将任何类型的对象写入文件,然后将其读回原始对象。非常感谢您对我的帮助。

为什么不使用MemoryStream而不是FileStream?MemoryStream可以用作LoadFile方法上的FileStream?您的代码如何编译
FileStream
在我的问题中不接受构造函数中的0个参数,我已经提到,字节数组没有从服务器上的任何文件中读取。这只是我从数据库或其他来源获得的字节数组。所以请不要将文件直接读入FileStream。为什么
那么请不要将文件直接读入FileStream
?您正在使用
Server.MapPath(“~/Files/”+fileName)
读取磁盘上的文件。如果您不打算读取磁盘上的任何文件,请不要在上面使用FileStream。您是对的。我只有字节数组,它不是从任何文件加载的。你能帮我吗?因为方法“LoadFile”需要一个FileStream,而我只有一个来自数据库的字节数组。那么我如何将它用于我的方法“LoadFile”?是的。我说过FileStream不能直接读取字节。如果MemoryStream可以包含字节数组,那么我如何将其用于我的方法“LoadFile”?要么更改
LoadFile
以获取
,要么将
字节
数组写入一个文件,并从中创建
文件流
。使用这两个方法都从流派生的事实,以便可以传递任何流。您将体验到继承的有用性:)如果我将字节数组写入文件,然后将文件读回FileStream,那么如果文件仅存在于数据库中,而不存在于服务器上的任何驱动器上,我如何读取该文件?如果您不想将字节数组写入文件以读取该文件,那么这确实是我的两个选项中最糟糕的一个。然后,您所要做的就是更改
LoadFile
以获取
流而不是
FileStream
,然后将字节数组加载到
MemoryStream
中并传递它。您的方法使用memStream,但我从您的代码中得到了一个错误。上面说:“输入流不是有效的二进制格式。当在运行时,起始内容(字节)是:1F-8B-08-00-00-00-00-04-00-ED-BD-07-60-1C-49-96”