多くのデータが含まれているストリームがあります。私はそのデータの一部を別のストリームに公開したいと思います。私が抽出したいデータの断片は、しばしば100MBを超えることができます。私はすでにそこにデータを持っているので、そのデータを別のストリームにコピーして返すのは無駄だと思われます。私が探しているのは、第1ストリームのデータを参照し、第2ストリームがどれだけ参照できるかを制御する方法です。これは可能ですストリームのサブセクションをユーザーに公開する方法
答えて
独自のStreamクラスを作成して位置を検証し、必要なサブセットを返す必要があります。
私はこれを行う組み込みクラスについて認識していません。
正確に複製するのは怖いですか?私はあなたがスーパーパフォーマンスが重大であるとは思わない、あなたのストリームをその場で解析し、何か他のものが必要になるまでMemoryStreamを使用する。
は、私は、データの価値mesgs数百人をコピーされるだろう、とメモリ内の別の場所にいることをコピーしたくない:コードがありました。具体的には、人が複数の100メガセクションを要求する場合です。重複の恐れではなく、他のクラスが存在する場合、それらを再利用するようにプログラミングすることです。 – QueueHammer
StreamMuxerのように見えますが、プロジェクトは似たような目的で作成されました。
これはよさそうだ。コードプロジェクトがGit Hubと協力してくれたらと思っています。おそらく、少しの利害の衝突。 – QueueHammer
これは、Mark Gravell detailed hereによってうまく実装されています。
using System.IO;
using System;
static class Program
{
// shows that we can read a subset of an existing stream...
static void Main()
{
byte[] buffer = new byte[255];
for (byte i = 0; i < 255; i++)
{
buffer[i] = i;
}
using(MemoryStream ms = new MemoryStream(buffer))
using (SubStream ss = new SubStream(ms, 10, 200))
{
const int BUFFER_SIZE = 17; // why not...
byte[] working = new byte[BUFFER_SIZE];
int read;
while ((read = ss.Read(working, 0, BUFFER_SIZE)) > 0)
{
for (int i = 0; i < read; i++)
{
Console.WriteLine(working[i]);
}
}
}
}
}
class SubStream : Stream
{
private Stream baseStream;
private readonly long length;
private long position;
public SubStream(Stream baseStream, long offset, long length)
{
if (baseStream == null) throw new ArgumentNullException("baseStream");
if (!baseStream.CanRead) throw new ArgumentException("can't read base stream");
if (offset < 0) throw new ArgumentOutOfRangeException("offset");
this.baseStream = baseStream;
this.length = length;
if (baseStream.CanSeek)
{
baseStream.Seek(offset, SeekOrigin.Current);
}
else
{ // read it manually...
const int BUFFER_SIZE = 512;
byte[] buffer = new byte[BUFFER_SIZE];
while (offset > 0)
{
int read = baseStream.Read(buffer, 0, offset < BUFFER_SIZE ? (int) offset : BUFFER_SIZE);
offset -= read;
}
}
}
public override int Read(byte[] buffer, int offset, int count)
{
CheckDisposed();
long remaining = length - position;
if (remaining <= 0) return 0;
if (remaining < count) count = (int) remaining;
int read = baseStream.Read(buffer, offset, count);
position += read;
return read;
}
private void CheckDisposed()
{
if (baseStream == null) throw new ObjectDisposedException(GetType().Name);
}
public override long Length
{
get { CheckDisposed(); return length; }
}
public override bool CanRead
{
get { CheckDisposed(); return true; }
}
public override bool CanWrite
{
get { CheckDisposed(); return false; }
}
public override bool CanSeek
{
get { CheckDisposed(); return false; }
}
public override long Position
{
get {
CheckDisposed();
return position;
}
set { throw new NotSupportedException(); }
}
public override long Seek(long offset, SeekOrigin origin)
{
throw new NotSupportedException();
}
public override void SetLength(long value)
{
throw new NotSupportedException();
}
public override void Flush()
{
CheckDisposed(); baseStream.Flush();
}
protected override void Dispose(bool disposing)
{
base.Dispose(disposing);
if (disposing)
{
if (baseStream != null)
{
try { baseStream.Dispose(); }
catch { }
baseStream = null;
}
}
}
public override void Write(byte[] buffer, int offset, int count)
{
throw new NotImplementedException();
}
}
- 1. アプリケーション内のユーザーの友人のストリーム/壁に何かを公開する方法
- 2. フラッシュコンテンツをFacebookのストリームに公開する
- 3. 公開ストリームでフィルタを適用する方法
- 4. githubでストリームを公開
- 5. Pythonプログラムをユーザーに公開する方法
- 6. JenkinsユーザーにAndroid SDKを正しく公開する方法
- 7. ユーザーIAM資格情報を非公開にする方法
- 8. プロファイルを公開せずにWebサイトを公開する方法
- 9. カスタムリゾルバでユーザー/アクセスエンジンを公開する方法を確認する方法
- 10. アンドロイドでユーザーをスワイプして公開する方法
- 11. spring data rest:ユーザー管理apiを公開する方法
- 12. リレーショナルデータベースのサブセクションのモデリング方法
- 13. ローカルネットワークにファイルサーバーサービスを公開する方法
- 14. pygameをウェブページに公開する方法
- 15. ドッカーファイルにポートを公開する方法
- 16. 公開リポジトリをプライベートにする方法
- 17. VSTS経由でiOSアプリを公開/公開する方法
- 18. rtmpストリームをlibrtmpでFMSに公開する際の問題
- 19. NSFetchedResultsControllerでサブセクションを作成する方法
- 20. DataTableの列を公開する方法
- 21. 私のコードを安全にする方法は? - 非公開vs.公開
- 22. Facebookのストリームが壁紙にAppとして公開する/ページ
- 23. CakePHP:ユーザーの公開プロフィール
- 24. ストリーム内でAkkaストリームを作成して開始する方法
- 25. アプリケーションの公開方法
- 26. JIRAボードの公開方法
- 27. セマンティックコンフィグレーションを公開する方法
- 28. Django:アプリを公開する方法
- 29. 公開アプリを更新する方法
- 30. .netアプリケーションを公開する方法
だから今、私の仕事が始まる... – QueueHammer