2017-09-27 8 views
-1

Iが約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(バイト[]配列int offset、int count)

今、私は書き込み機能で伸張率を上げるためにスレッドを使用したいので、読み込みと書き込みの部分を分けようとしています。私は動的配列

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(); 
     } 
    } 
} 

書き込み::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(); 
    } 
} 

編集

(1)byte[] data = new byte[2048]

読む以下のようにファイルのデータおよびサイズを堆積するbyte[]int[]新しい配列にデータを割り当てる。

(2)List<int> SizeList = new List<int>()に変更int[] SizeList = new int[2048]を理由int型の範囲の

+2

まず、 'StreamWriter'ではなく' Stream'であるときに変数 'streamWriter'を呼び出すのはかなり混乱します。私は強く 'ストリーム'と呼ぶことを強くお勧めしたいと思います。しかし、私は非常に多くの問題は、あなたが別のスレッドでそれを書き込もうとしている間にあなたのストリームを "メイン"スレッドで閉じていることです。 –

+0

ああ、それは本当です、私はあなたの推薦で編集します、ありがとうございます。 – Peter

+0

IOのためにこのようなスレッドを使用すると、処理が遅くなってバグが発生する可能性があります。 IOには1つのスレッドを使用します。 – Enigmativity

答えて

0

ストリームに読んでのみ(通常はそれがよりになる1つのバイトを返すようにguarantiedされていますが、要求されたフルに頼ることはできません長さは毎回)、理論的に2048バイト後に解決することができます。これは、SizeListが2048エントリしか保持できないためです。

リストを使用してサイズを保持できます。

または、独自の発明ではなく、MemoryStreamを使用してください。

しかし、2つの主な問題は次のとおりです。 1)以前読み込んだデータを上書きして同じバイト配列に読み込みます。データバイト配列をmydatalistに追加するときは、新しいバイト配列にデータを割り当てる必要があります。 2)2番目のスレッドが書き込みを終える前にストリームを閉じます。

一般的にスレッド化は難しく、パフォーマンスを向上させることがわかっている場所でのみ使用してください。単純にデータを読み書きするのは、一般的にIOバウンドです(CPUバウンドではありません).2番目のスレッドを導入するだけでパフォーマンスが低下し、スピードが向上しません。あなたはマルチスレッドを使用して同時読み書き操作を保証することができますが、最初の解決策に固執すれば、ディスクキャッシュはこれを行うでしょう - もしそうでなければ、asyncはこれを達成するためにマルチスレッドより簡単です。

+0

それは動作します、私はあなたの助けを借りて、 'byte [] data = new byte [2048];をwhileループに変更し、サイズと内容は正しいです。 – Peter

+0

素晴らしい。スレッドを削除すると、コードが遅くなり、エラーが発生しやすくなります。 –

関連する問題