2017-09-27 105 views
-1

当我搜索方法有关通过使用SharpZipLib文件解压缩,我发现很多这样的方法:在FileStream中写入有什么不同?

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是:

FileStream.Write(byte []数组, int offset,int count)

现在我尝试分开读写的一部分,因为我想用线程来加快写入函数中的解压缩速度,并且我使用动态数组byte[]int[]存放文件的数据和大小像下面

阅读:

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; 

      List<int> SizeList = new List<int>(); 
      List<byte[]> mydatalist = new List<byte[]>(); 

      while (true) 
      { 
       byte[] data = new byte[2048]; 
       size = s.Read(data, 0, data.Length); 

       if (size > 0) 
       { 
        mydatalist.Add(data); 
        SizeList.Add(size); 
       } 
       else 
       { 
        break; 
       } 
      } 
      test = new Thread(() => 
       FileWriteFun(pathToTar, args, SizeList, 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(); 
    } 
} 

编辑

(1)byte[] data = new byte[2048]到while循环将数据分配给新阵列。

(2)改变int[] SizeList = new int[2048]List<int> SizeList = new List<int>()因为INT范围

+2

首先,当它是一个Stream而不是StreamWriter时,调用一个变量'streamWriter'是相当混乱的。我强烈建议你把它叫做'stream'。但我非常期望问题是,当你试图在另一个线程中写入它时,你正在关闭“主”线程中的流。 –

+0

哦,的确如此,我会根据你的推荐进行编辑,谢谢。 – Peter

+0

使用类似IO的线程可能会减慢速度并使其变得越来越麻烦。使用一个线程进行IO。 – Enigmativity

回答

0

作为对流中读取只guarantied返回一个字节(通常它会更多,但你不能依赖于所请求的全每个时间长度),你的解决方案理论上可以在2048个字节后失败,因为你的SizeList只能容纳2048个条目。

您可以使用列表来保存尺寸。

或者使用MemoryStream而不是发明自己的。

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

一般而言,线程难度很大,只能在知道它会提高性能的地方使用。简单地读写数据通常是IO性能上的约束,而不是CPU约束,所以引入第二个线程只会给性能带来很小的损失,而且速度并没有提高。您可以使用多线程来确保并发读/写操作,但如果您坚持第一种解决方案,很可能磁盘缓存将为您执行此操作 - 如果不是,则使用异步比多线程更容易实现此操作。

+0

它工作,我改变'字节[]数据=新字节[2048];'进入while循环,大小和内容是正确的,感谢您的帮助。 – Peter

+0

太好了。现在删除线程,它只会让你的代码更慢,更容易出错。 –

相关问题