Ich habe gestern einen Klasse zum Speichern von größeren Datenmengen gebraucht, ohne jedoch einen gewissen Speicherverbrauch zu überschreiten. Leider habe ich nix fertiges gefunden also habe ich schnell selber einen Art Buffer geschrieben welcher ein Array besitzt, welches sich selbst überschreibt wenn der Buffer voll ist. Ich hab es gestern Abend geschrieben und von dem her ist die Klasse vll. noch optimierungs fähig. Wäre dankbar über Vorschläge. Ich poste mal unten den Code (ist von C# konvertiert) und falls wiedermal jemand im Netz sowas sucht(wie ich) findet er es dann hoffentlich.
Code
Anwendungen:
Eine Anwendung wäre z.B. wenn man z.B. irgendetwas vom Internet Streamt, Chats programmiert etc. den Buffer so verwenden kann, dass man das gestreamte dort drinnen speichert und anschließend ausgibt. Ist es ausgegeben, wird es nicht mehr benötigt und kann weggeworfen werden. Als Resultat hat man einen kontinuierlichen Stream welcher aber nicht immer mehr Speicher braucht.
Hier noch ein kleines Beispiel wo ich das z.B. gebraucht habe(stream von ö3 - radio):
youtube.com/watch?v=RccSkY0gyJc&feature=channel&list=UL
VB.NET-Quellcode
- Public Class StaticBuffer(Of T) : Implements IDisposable 'optional auch von System.IO.Stream ableiten
- Private _buffer As T() 'buffer welcher immer wieder überschrieben wird
- Private _bufferedBytes As Integer = 0 'anzahl der vorhandenen Bytes
- Private _writeOffset As Integer = 0 'Schreibeoffset im Buffer
- Private _readOffset As Integer = 0 'Leseoffset im Buffer
- Private _lockObj As New Object()
- Public Sub New(ByVal bufferSize As Integer)
- _buffer = New T(bufferSize - 1) {}
- End Sub
- Public Function Write(ByVal buffer As T(), ByVal offset As Integer, ByVal count As Integer) As Integer
- Dim written As Integer = 0
- SyncLock _lockObj
- If count > _buffer.Length - _bufferedBytes Then
- count = _buffer.Length - _bufferedBytes
- End If
- Dim length As Integer = Math.Min(count, _buffer.Length - _writeOffset)
- Array.Copy(buffer, offset, _buffer, _writeOffset, length) 'copy to buffer
- _writeOffset += length
- written += length
- _writeOffset = _writeOffset Mod _buffer.Length
- 'WENN GERADE ENDE DES ARRAYS ÜBERSCHRITTEN WURDE:
- If written < count Then
- Array.Copy(buffer, offset + written, _buffer, _writeOffset, count - written)
- _writeOffset += (count - written)
- written += (count - written)
- End If
- _bufferedBytes += written
- End SyncLock
- Return written
- End Function
- Public Function Read(ByVal buffer As T(), ByVal offset As Integer, ByVal count As Integer) As Integer
- Dim rd As Integer = 0
- SyncLock _lockObj
- count = Math.Min(count, _bufferedBytes)
- Dim length As Integer = Math.Min(count, _buffer.Length - _readOffset)
- Array.Copy(_buffer, _readOffset, buffer, offset, length) 'copy to buffer
- _readOffset = _readOffset Mod _buffer.Length
- Read += length
- _readOffset += Read
- 'WENN GERADE ENDE DES ARRAYS ÜBERSCHRITTEN WURDE:
- If Read < count Then
- Array.Copy(_buffer, _readOffset, buffer, offset + Read, count - Read)
- _readOffset += (count - Read)
- Read += (count - Read)
- End If
- _bufferedBytes -= Read
- End SyncLock
- Return Read
- End Function
- Public ReadOnly Property Length() As Integer
- Get
- Return _buffer.Length
- End Get
- End Property
- Public ReadOnly Property Buffered() As Integer
- Get
- Return _bufferedBytes
- End Get
- End Property
- Public Sub Clear()
- Array.Clear(_buffer, 0, _buffer.Length) 'alle offsets zurücksetzen
- _bufferedBytes = 0
- _writeOffset = 0
- _readOffset = 0
- End Sub
- Public Sub Dispose() Implements IDisposable.Dispose
- _buffer = Nothing
- End Sub
- End Class
Eine Anwendung wäre z.B. wenn man z.B. irgendetwas vom Internet Streamt, Chats programmiert etc. den Buffer so verwenden kann, dass man das gestreamte dort drinnen speichert und anschließend ausgibt. Ist es ausgegeben, wird es nicht mehr benötigt und kann weggeworfen werden. Als Resultat hat man einen kontinuierlichen Stream welcher aber nicht immer mehr Speicher braucht.
Hier noch ein kleines Beispiel wo ich das z.B. gebraucht habe(stream von ö3 - radio):
youtube.com/watch?v=RccSkY0gyJc&feature=channel&list=UL
Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „ErfinderDesRades“ ()