문자열에서 스트림을 생성하려면 어떻게 해야 합니까?
텍스트 파일에서 스트림을 가져오는 방법에 대한 단위 테스트를 작성해야 합니다.저는 다음과 같은 일을 하고 싶습니다.
Stream s = GenerateStreamFromString("a,b \n c,d");
public static Stream GenerateStreamFromString(string s)
{
var stream = new MemoryStream();
var writer = new StreamWriter(stream);
writer.Write(s);
writer.Flush();
stream.Position = 0;
return stream;
}
사용 방법을 잊지 마십시오.
using (var stream = GenerateStreamFromString("a,b \n c,d"))
{
// ... Do stuff to stream
}
정보StreamWriter
미처분의 StreamWriter
는 기본 스트림 주위의 래퍼일 뿐이며 폐기해야 하는 리소스는 사용하지 않습니다.그Dispose
메소드가 기본값을 닫습니다.Stream
그거StreamWriter
편지를 쓰고 있습니다.이 경우에 그것은MemoryStream
우리는 돌아가고 싶습니다.
.NET 4.5에서는 이제 다음에 대한 오버로드가 있습니다.StreamWriter
작성자가 삭제된 후 기본 스트림을 열어두지만 이 코드는 동일한 작업을 수행하고 의 다른 버전과 함께 작동합니다.NET도.
BaseStream을 닫지 않고 StreamWriter를 닫는 방법이 있습니까?를 참조하십시오.
다른 솔루션:
public static MemoryStream GenerateStreamFromString(string value)
{
return new MemoryStream(Encoding.UTF8.GetBytes(value ?? ""));
}
정적 문자열 유틸리티 클래스에 추가합니다.
public static Stream ToStream(this string str)
{
MemoryStream stream = new MemoryStream();
StreamWriter writer = new StreamWriter(stream);
writer.Write(str);
writer.Flush();
stream.Position = 0;
return stream;
}
이 기능은 확장 기능을 추가하므로 다음 작업을 간단히 수행할 수 있습니다.
using (var stringStream = "My string".ToStream())
{
// use stringStream
}
public Stream GenerateStreamFromString(string s)
{
return new MemoryStream(Encoding.UTF8.GetBytes(s));
}
다음을 위한 확장 방법의 현대화되고 약간 수정된 버전ToStream
:
public static Stream ToStream(this string value) => ToStream(value, Encoding.UTF8);
public static Stream ToStream(this string value, Encoding encoding)
=> new MemoryStream(encoding.GetBytes(value ?? string.Empty));
@Shaun Bowe 답변에 대한 @Palec의 코멘트에서 제안된 수정.
또는 원라이너(@satnhak 제안)로서:
public static Stream ToStream(this string value, Encoding encoding = null)
=> new MemoryStream((encoding ?? Encoding.UTF8).GetBytes(value ?? string.Empty));
저는 다음과 같은 답변을 사용했습니다.
public static Stream ToStream(this string str, Encoding enc = null)
{
enc = enc ?? Encoding.UTF8;
return new MemoryStream(enc.GetBytes(str ?? ""));
}
그런 다음 이렇게 사용합니다.
String someStr="This is a Test";
Encoding enc = getEncodingFromSomeWhere();
using (Stream stream = someStr.ToStream(enc))
{
// Do something with the stream....
}
사용MemoryStream
클래스, 호출Encoding.GetBytes
먼저 문자열을 바이트 배열로 변환합니다.
나중에 필요하십니까?TextReader
시내에서?만약 그렇다면, 당신은 공급할 수 있습니다.StringReader
직접적으로, 그리고 우회합니다.MemoryStream
그리고.Encoding
계단
아래 나열된 확장 방법을 사용합니다.개발자에게 인코딩에 대한 결정을 내리도록 해야 마법이 덜 걸린다고 생각합니다.
public static class StringExtensions {
public static Stream ToStream(this string s) {
return s.ToStream(Encoding.UTF8);
}
public static Stream ToStream(this string s, Encoding encoding) {
return new MemoryStream(encoding.GetBytes(s ?? ""));
}
}
인코딩을 변경해야 한다면 @ShaunBowe의 솔루션에 찬성합니다.하지만 여기 있는 모든 대답은 적어도 한 번은 메모리의 전체 문자열을 복사합니다.에 대한 답변ToCharArray
+BlockCopy
콤보 두 번.
여기서 그게 중요하다면 간단한 것입니다.Stream
Raw UTF-16 문자열의 래퍼입니다.a와 함께 사용할 경우StreamReader
선택한다.Encoding.Unicode
그것을 위해:
public class StringStream : Stream
{
private readonly string str;
public override bool CanRead => true;
public override bool CanSeek => true;
public override bool CanWrite => false;
public override long Length => str.Length * 2;
public override long Position { get; set; } // TODO: bounds check
public StringStream(string s) => str = s ?? throw new ArgumentNullException(nameof(s));
public override long Seek(long offset, SeekOrigin origin)
{
switch (origin)
{
case SeekOrigin.Begin:
Position = offset;
break;
case SeekOrigin.Current:
Position += offset;
break;
case SeekOrigin.End:
Position = Length - offset;
break;
}
return Position;
}
private byte this[int i] => (i & 1) == 0 ? (byte)(str[i / 2] & 0xFF) : (byte)(str[i / 2] >> 8);
public override int Read(byte[] buffer, int offset, int count)
{
// TODO: bounds check
var len = Math.Min(count, Length - Position);
for (int i = 0; i < len; i++)
buffer[offset++] = this[(int)(Position++)];
return (int)len;
}
public override int ReadByte() => Position >= Length ? -1 : this[(int)Position++];
public override void Flush() { }
public override void SetLength(long value) => throw new NotSupportedException();
public override void Write(byte[] buffer, int offset, int count) => throw new NotSupportedException();
public override string ToString() => str; // ;)
}
그리고 여기 필요한 바운드 검사(에서 파생)가 포함된 보다 완벽한 솔루션이 있습니다.MemoryStream
그래서 그것은ToArray
그리고.WriteTo
방법도 포함).
여기 있습니다.
private Stream GenerateStreamFromString(String p)
{
Byte[] bytes = UTF8Encoding.GetBytes(p);
MemoryStream strm = new MemoryStream();
strm.Write(bytes, 0, bytes.Length);
return strm;
}
MemoryStream을 사용하면 이점을 얻을 수 있다고 생각합니다.Encoding 클래스의 GetBytes 메서드를 사용하여 얻은 문자열 바이트로 채울 수 있습니다.
C# 11을 사용하면 한 줄로 이 작업을 수행할 수 있습니다.
var ms = new MemoryStream("some string"u8.ToArray());
Utf8 Strings Literals에 대한 자세한 내용은 https://learn.microsoft.com/en-us/dotnet/csharp/language-reference/proposals/csharp-11.0/utf8-string-literals#detailed-design 에서 확인할 수 있습니다.
Stream stream = ToStream(""); //passing your string input.
public static Stream ToStream(string str)
{
MemoryStream stream = new MemoryStream();
StreamWriter writer = new StreamWriter(stream);
writer.Write(str);
writer.Flush();
stream.Position = 0;
return stream;
}
문자열 확장자의 적절한 조합:
public static byte[] GetBytes(this string str)
{
byte[] bytes = new byte[str.Length * sizeof(char)];
System.Buffer.BlockCopy(str.ToCharArray(), 0, bytes, 0, bytes.Length);
return bytes;
}
public static Stream ToStream(this string str)
{
Stream StringStream = new MemoryStream();
StringStream.Read(str.GetBytes(), 0, str.Length);
return StringStream;
}
언급URL : https://stackoverflow.com/questions/1879395/how-do-i-generate-a-stream-from-a-string
'it-source' 카테고리의 다른 글
분할 오류에서 Linux에서 코어 덤프를 생성하는 방법은 무엇입니까? (0) | 2023.05.16 |
---|---|
ViewModel의 명령에 WPF 바인딩 UI 이벤트 (0) | 2023.05.16 |
옵션 경로에 CORS 헤더를 추가하면 브라우저에서 내 API에 액세스할 수 없는 이유는 무엇입니까? (0) | 2023.05.16 |
"would clobber 기존 태그"를 제거하는 방법 (0) | 2023.05.16 |
jQuery를 사용하여 로드 시 선택한 라디오 옵션을 설정하는 방법 (0) | 2023.05.11 |