¿Cómo leo un flujo y restablezco su posición a cero incluso si stream.CanSeek == false
? Necesito algo de trabajo alrededor.Cómo leer un flujo y restablecer su posición a cero incluso si stream.CanSeek == falso
Respuesta
Si su escenario le permite reemplazar su secuencia original, entonces puede verificar si admite búsqueda y, si no, leer su contenido y envolverlos en un nuevo MemoryStream
, que luego podría usar para las operaciones posteriores.
static string PeekStream(ref Stream stream)
{
string content;
var reader = new StreamReader(stream);
content = reader.ReadToEnd();
if (stream.CanSeek)
{
stream.Seek(0, SeekOrigin.Begin);
}
else
{
stream.Dispose();
stream = new MemoryStream(Encoding.UTF8.GetBytes(content));
}
return content;
}
Lo anterior es bastante ineficiente, ya que debe asignar memoria para dos veces el tamaño de su contenido. Mi recomendación sería adaptar las partes de su código a las que está accediendo a la transmisión (después de haber leído todo su contenido) para hacer que accedan a la copia almacenada de su contenido. Por ejemplo:
string content;
using (var reader = new StreamReader(stream))
content = reader.ReadToEnd();
// Process content here.
string line;
using (var reader = new StringReader(content))
while ((line = reader.ReadLine()) != null)
Console.WriteLine(line);
Desde el StringReader
simplemente lee de la cadena de content
, usted no perder la memoria creación de copias repetidas de sus datos.
Este enfoque es correcto hasta que tenga datos muy grandes. Si tiene algunos gigabytes, es mejor reiniciar su transmisión. En mi opinión, el propósito de la transmisión es no almacenar todos los datos que está procesando. –
Tiene razón acerca de 'MemoryStream' no es adecuado para grandes cantidades de datos. Ya sea para almacenar o reiniciar la transmisión depende del escenario. Por ejemplo, si está procesando datos descargados de Internet y necesita leerlos varias veces, entonces es mejor almacenar los datos localmente (en la memoria o en un archivo temporal) que descargarlos nuevamente. – Douglas
Utilice otra implementación de Stream que admita la búsqueda. Si Stream.CanSeek
devuelve falso, entonces esa implementación está afirmando que no es compatible con la búsqueda.
El objeto MemoryStream
es compatible con la búsqueda. Puede copiar una secuencia arbitraria en un MemoryStream usando algo como esto, y la secuencia resultante admitirá la búsqueda, por ejemplo, puede restablecer la posición a 0 y leer de ella repetidamente.
MemoryStream CopyStreamToMemory(Stream inputStream)
{
MemoryStream ret = new MemoryStream();
const int BUFFER_SIZE = 1024;
byte[] buf = new byte[BUFFER_SIZE];
int bytesread = 0;
while ((bytesread = inputStream.Read(buf, 0, BUFFER_SIZE)) > 0)
ret.Write(buf, 0, bytesread);
ret.Position = 0;
return ret;
}
Por supuesto, si su flujo lee los datos que no cambia, sólo tiene que desechar el antiguo arroyo, y crear una nueva corriente que lee los mismos datos.
- 1. Cómo restablecer BigDecimal a cero
- 2. Restablecer el estado de un flujo
- 3. java.net.URL leer flujo a byte []
- 4. FileExists() devuelve falso, incluso si el archivo existe
- 5. ¿Cómo leer un flujo en otro?
- 6. Arrastrar y soltar objetos y devolverlos a su posición original
- 7. ¿Comprueba Java todos los argumentos en el operador "&&" (y) incluso si uno de ellos es falso?
- 8. La altura del div principal es cero incluso si tiene un hijo con alturas finitas
- 9. ¿Cómo puedo probar si una propiedad existe en un objeto antes de leer su valor?
- 10. Incluso si DropDownList tiene su viestate discapacitados, SelectedValue todavía debe devolver un valor
- 11. ¿Cómo escribir/leer bits desde/hacia un flujo? (C#)
- 12. En iOS: ¿Cómo ajusto un UILabel a su texto, sin cambiar su posición?
- 13. Cómo saber si un flujo BufferedReader está cerrado
- 14. MySQL Eliminar todas las filas de la tabla y restablecer ID a cero
- 15. Cómo restablecer un diccionario
- 16. SQL - Devolver todas las filas, incluso si el recuento es cero para el elemento
- 17. ¿Cómo puedo "restablecer" la propiedad de un control a su valor de estilo original (como Fondo)
- 18. Comprobar si es falso
- 19. Cómo cancelar/restablecer un UIGestureRecognizer
- 20. ¿Cómo verificar si un parámetro es verdadero o falso?
- 21. java.io.NotSerializableException incluso si implemento "Serializable"
- 22. ¿Cómo puedo determinar un carácter Unicode desde su nombre en Python, incluso si ese personaje es un personaje de control?
- 23. Cómo comprobar si el GUID es cero
- 24. Cómo convertir "0" y "1" a falso y verdadero
- 25. Método de traducción HTML5, cómo restablecer a los valores predeterminados?
- 26. cómo hacer frente a la posición en la aC# corriente
- 27. Usando MD5 asegurado incluso su más difícil
- 28. ¿Cómo leer todo el flujo en una std :: string?
- 29. Javascript: ¿Por qué si (falso)?
- 30. Restablecer desplazamiento en ScrollView
Si 'CanSeek == false', cualquier intento de este tipo puede dar como resultado una excepción. – Oded
@oded; Yo sé eso; Es por eso que hice la pregunta – Faisal