2017-09-27 103 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

太好了。現在刪除線程,它只會讓你的代碼更慢,更容易出錯。 –

相關問題