C# 在FileStream中编写有什么不同?

C# 在FileStream中编写有什么不同?,c#,arrays,filestream,C#,Arrays,Filestream,当我使用SharpZipLib搜索关于解压缩文件的方法时,我发现了很多类似的方法: public static void TarWriteCharacters(string tarfile, string targetDir) { using (TarInputStream s = new TarInputStream(File.OpenRead(tarfile))) { //some codes here using (FileStream f

当我使用
SharpZipLib
搜索关于解压缩文件的方法时,我发现了很多类似的方法:

public static void TarWriteCharacters(string tarfile, string targetDir)
{
    using (TarInputStream s = new TarInputStream(File.OpenRead(tarfile)))
    {
        //some codes here

        using (FileStream fileWrite = File.Create(targetDir + directoryName + fileName))
        {                          
            int size = 2048;
            byte[] data = new byte[2048];
            while (true)
            {
                size = s.Read(data, 0, data.Length);
                if (size > 0)
                {
                    fileWrite.Write(data, 0, size);
                }
                else
                {
                    break;
                }
            }
            fileWrite.Close();
        }
    }
}
FileStream.Write的格式为:

写入(字节[]数组,整数偏移量,整数计数)

现在我尝试分离读写部分,因为我想在写函数中使用线程来加快解压缩速度,我使用动态数组
byte[]
int[]
来存储文件的数据和大小,如下所示

阅读:

publicstaticvoidtarwritecharacters(字符串tarfile,字符串targetDir)
{
使用(TarInputStream s=newtarinputstream(File.OpenRead(tarfile)))
{
//这里有一些代码
使用(FileStream fileWrite=File.Create(targetDir+directoryName+fileName))
{                          
int size=2048;
列表大小列表=新列表();
List mydatalist=新列表();
while(true)
{
字节[]数据=新字节[2048];
大小=s.Read(数据,0,数据长度);
如果(大小>0)
{
添加(数据);
添加(大小);
}
其他的
{
打破
}
}
测试=新线程(()=>
FileWriteFun(路径、参数、大小列表、mydatalist)
);
test.Start();
streamWriter.Close();
}
}
}
写:

public static void FileWriteFun(string pathToTar , string[] args, List<int> SizeList, List<byte[]> mydataList)
{
    //some codes here

    using (FileStream fileWrite= File.Create(targetDir + directoryName + fileName))
    {
        for (int i = 0; i < mydataList.Count; i++)
        {
            fileWrite.Write(mydataList[i], 0, SizeList[i]);
        }
        fileWrite.Close();
    }
}
publicstaticvoidfilewritefun(字符串pathToTar,字符串[]args,列表大小列表,列表mydataList)
{
//这里有一些代码
使用(FileStream fileWrite=File.Create(targetDir+directoryName+fileName))
{
for(int i=0;i
编辑

(1)
byte[]data=new byte[2048]
进入while循环,将数据分配给新数组

(2) 由于int范围,将
int[]SizeList=new int[2048]
更改为
List SizeList=new List()


由于在流上读取只能返回一个字节(通常会更多,但您不能每次都依赖于请求的完整长度),因此从理论上讲,您的解决方案在2048个字节后可能会失败,因为SizeList只能保存2048个条目

您可以使用列表来保存大小

或者使用记忆流,而不是自己发明

但两个主要问题是: 1) 继续读取同一字节数组,覆盖以前读取的数据。将数据字节数组添加到mydatalist时,必须将数据分配给新的字节数组。 2) 在第二个线程完成写入之前关闭流


一般来说,线程是困难的,应该只在您知道它会提高性能的地方使用。简单地读取和写入数据在性能上通常是IO限制的,而不是cpu限制的,因此引入第二个线程只会带来较小的性能损失,而不会提高速度。您可以使用多线程来确保并发读/写操作,但如果您坚持使用第一种解决方案,磁盘缓存很可能会为您做到这一点-amd如果没有,使用异步比多线程更容易实现这一点。

首先,当变量
streamWriter
流而不是
streamWriter
时,调用变量
streamWriter
非常容易混淆。我强烈建议您将其称为
stream
。但我非常希望问题是,当您试图在另一个线程中写入流时,您正在关闭“主”线程中的流。哦,这是真的,我将根据您的建议进行编辑,谢谢。在IO中使用这样的线程可能会减慢速度并使其出现问题。使用一个线程进行IO。@Enigmativity你是对的,我找到了一些关于使用线程的信息,他们说错误地使用线程会更慢,但是如果我想加快这个项目,似乎使用线程是唯一的方法。@Peter-为什么你建议做错事是正确的?这是有效的,我更改了
byte[]数据=新字节[2048]进入while循环,并且大小和内容都正确,谢谢您的帮助。太好了。现在删除线程,这只会使代码更慢,更容易出错。
public static void FileWriteFun(string pathToTar , string[] args, List<int> SizeList, List<byte[]> mydataList)
{
    //some codes here

    using (FileStream fileWrite= File.Create(targetDir + directoryName + fileName))
    {
        for (int i = 0; i < mydataList.Count; i++)
        {
            fileWrite.Write(mydataList[i], 0, SizeList[i]);
        }
        fileWrite.Close();
    }
}