recorrer leer escribir archivos c# stream

leer - streamreader to file c#



Escribir String to Stream y leerlo de nuevo no funciona (5)

Creo que sería mucho más productivo usar un TextWriter , en este caso un StreamWriter para escribir en MemoryStream. Después de eso, como han dicho otros, necesita "rebobinar" el MemoryStream usando algo como stringAsStream.Position = 0L; .

stringAsStream = new MemoryStream(); // create stream writer with UTF-16 (Unicode) encoding to write to the memory stream using(StreamWriter sWriter = new StreamWriter(stringAsStream, UnicodeEncoding.Unicode)) { sWriter.Write("Lorem ipsum."); } stringAsStream.Position = 0L; // rewind

Tenga en cuenta que:

StreamWriter usa de manera predeterminada una instancia de UTF8Encoding a menos que se especifique lo contrario. Esta instancia de UTF8Encoding se construye sin una marca de orden de bytes (BOM)

Además, no tiene que crear un new UnicodeEncoding() general, ya que hay uno como miembro estático de la clase para que lo use en convenientes utf-8, utf-16 y utf-32.

Y luego, finalmente (como han dicho otros), estás tratando de convertir los byte directamente en char , que no lo son. Si tuviera una secuencia de memoria y supiera que era una cadena, usaría un TextReader para recuperar la cadena de los bytes. Me parece "peligroso" perder el tiempo con los bytes en bruto.

Quiero escribir una cadena en una secuencia (un MemoryStream en este caso) y leer los bytes uno por uno.

stringAsStream = new MemoryStream(); UnicodeEncoding uniEncoding = new UnicodeEncoding(); String message = "Message"; stringAsStream.Write(uniEncoding.GetBytes(message), 0, message.Length); Console.WriteLine("This:/t/t" + (char)uniEncoding.GetBytes(message)[0]); Console.WriteLine("Differs from:/t" + (char)stringAsStream.ReadByte());

El resultado (no deseado) que obtengo es:

This: M Differs from: ?

Parece que no se está leyendo correctamente, ya que el primer carácter de "Mensaje" es "M", que funciona al obtener los bytes de la instancia de UnicodeEncoding, pero no al leerlos de la transmisión.

¿Qué estoy haciendo mal?

La imagen más grande: tengo un algoritmo que funcionará en los bytes de un Stream, me gustaría ser lo más general posible y trabajar con cualquier Stream. Me gustaría convertir un ASCII-String en un MemoryStream, o tal vez usar otro método para poder trabajar en el String como un Stream. El algoritmo en cuestión funcionará en los bytes del Stream.


Debes restablecer la transmisión al principio:

stringAsStream.Seek(0, SeekOrigin.Begin); Console.WriteLine("Differs from:/t" + (char)stringAsStream.ReadByte());

Esto también se puede hacer estableciendo la propiedad Position en 0:

stringAsStream.Position = 0


Después de escribir en el MemoryStream y antes de volver a leerlo, debe volver al comienzo del MemoryStream para no leer desde el final.

ACTUALIZAR

Después de ver su actualización, creo que hay una manera más confiable de construir la transmisión:

UnicodeEncoding uniEncoding = new UnicodeEncoding(); String message = "Message"; // You might not want to use the outer using statement that I have // I wasn''t sure how long you would need the MemoryStream object using(MemoryStream ms = new MemoryStream()) { var sw = new StreamWriter(ms, uniEncoding); try { sw.Write(message); sw.Flush();//otherwise you are risking empty stream ms.Seek(0, SeekOrigin.Begin); // Test and work with the stream here. // If you need to start back at the beginning, be sure to Seek again. } finally { sw.Dispose(); } }

Como puede ver, este código usa un StreamWriter para escribir toda la cadena (con la codificación adecuada) en el MemoryStream . Esto elimina la molestia de garantizar que se escribe toda la matriz de bytes para la cadena.

Actualización: entré en el problema con la transmisión vacía varias veces. Es suficiente llamar a Flush justo después de que haya terminado de escribir.


Está utilizando message.Length que devuelve el número de caracteres en la cadena, pero debería usar el número de bytes para leer. Deberías usar algo como:

byte[] messageBytes = uniEncoding.GetBytes(message); stringAsStream.Write(messageBytes, 0, messageBytes.Length);

Entonces estás leyendo un byte único y esperando obtener un personaje de él solo por conversión a char . UnicodeEncoding usará dos bytes por carácter.

Como dice Justin, tampoco estás buscando volver al comienzo de la transmisión.

Básicamente me temo que casi todo está mal aquí. Por favor, danos una imagen más completa y podemos ayudarte a encontrar lo que realmente deberías hacer. Usar un StreamWriter para escribir y luego un StreamReader para leer es posiblemente lo que quieras, pero realmente no podemos decir solo por el breve código que has mostrado.